使用AJAX / PHP / MySQL在服务器和客户端之间传输数据的安全有效方法?

时间:2012-06-21 06:04:17

标签: php javascript mysql ajax

嗯,我是PHP的新手,但是这几天想着这些东西让我很困惑。

以下是我的详细问题:

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

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

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

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

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

escape, unescape

行。知道我有这么多武器,但是......如何选择,组合和使用它们对我来说真的很头疼。

例如,假设我想要一个名为:

的产品名称

'%万岁%' +&安培; ABC

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

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

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

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

2 个答案:

答案 0 :(得分:2)

Serverside你想要的是prepared statements,也就是参数化查询,以保证你的数据库安全(避免SQL注入)。

客户端方面,我建议JSON使用已定义的对象和DOM操作,而不是innerText或innerHTML。浏览器将为了发布帖子而逃避所需的一切。

答案 1 :(得分:2)

在通过 ajax 发送数据之前,请对其进行编码: 假设数据是 javascript数组。 为什么一个阵列? 因为如果你已经有一个查询(例如'name = me& foo = b& ar')你怎么能解决那个'b& ar'显然是但是'b'的价值和'ar'为javascript引擎?

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

This函数替换所有有害的网址字符(,/?:@& = + $#)等等。 然后,您可以通过构建arr.join('');来发送您的查询 但我会使用jquery并立即发送数组。

PHP方上,您必须遵守的基本规则是从不保存您的数据而不mysql_real_escape_string();