0

好吧,我是 PHP 新手,但是这些天来思考这些东西真的让我很困惑。

这是我的详细问题:

首先,我需要在客户端和服务器之间传输数据。应该使用 Ajax 在客户端呈现数据。在服务器端,将使用 PHP 和 MySQL 来解析请求,抓取数据,然后将其发送回。

那么问题来了。浏览器发送的用户数据可以包含&, %, ', "这可能会损坏格式化的POST请求或进行数据库攻击。虽然我们可以使用JS来检测它们,但用户仍然可以绕过验证发送数据,更不用说我们不能简单地删除它们,因为它们可能对用户有用。

然后我检查了我的武器库。在服务器端,事实证明我有太多的功能来处理它们:
除了常规的表达之外,我还有

htmlspecialchars, htmlspecialchars_decode, addslashes, stripslashes
urlencode, urldecode, mysql_escape_string, mysql_real_escape_string

在使用javascript的客户端,我没有那么多但仍然有:

escape, unescape

好的。知道自己有这么多武器很好,但是……如何选择、组合和使用它们真的让我很头疼。

例如,假设我想要一个名为的产品名称:

'%万岁%'+&ABC

好吧,也许现实生活中不会有这样的产品被命名,但让我们以它为例。

& 标记将中断 POST 消息。
+ 可能会影响 ajax 解析。
单引号可能允许 SQL 注入。
% 标记可能会导致问题,但我不确定它是否会。

但是在将它发送到数据库并取回之后,我仍然希望该名称完全相同,
这意味着数据库中的名称可以不同但它在浏览器中的呈现应该是相同的。

那么这个问题可能有点太长了,但希望有人可以分享一些好的经验:如何使用这些函数处理用户输入字符串?

4

2 回答 2

2

服务器端你想要的是准备好的语句,也就是参数化查询,以保证你的数据库安全(避免 SQL 注入)。

在客户端,我会推荐带有已定义对象和 DOM 操作的 JSON,而不是 innerText 或 innerHTML。浏览器将转义发布帖子所需的一切。

于 2012-06-21T06:14:25.767 回答
2

在通过ajax发送数据之前,对它们进行编码:假设数据是一个javascript 数组。为什么是数组?因为如果你已经有一个查询(例如'name=me&foo=b&ar'),你如何解决'b&ar'这对来说显然是一个值,但对于javascript引擎来说'b'和'ar'呢?

for(i in arr)
   { arr[i] = encodeURIComponent(arr[i]); }

功能替换所有有害的 url 字符 (, / ? : @ & = + $ #) 等等。然后你可以通过建立像arr.join(''); 但我会使用 jquery 并在之后发送数组来发送你的查询。

PHP 方面,您必须遵守的基本规则是,您永远不要在不保存数据的情况下保存数据mysql_real_escape_string();

于 2012-06-21T06:36:46.657 回答