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

使用AJAX/PHP/MySQL在服务器和客户端之间安全有效地传输数据?,php,javascript,mysql,ajax,Php,Javascript,Mysql,Ajax,嗯,我是PHP新手,但是最近想到这些东西真的让我很困惑 以下是我的详细问题: 首先,我需要在客户端和服务器之间传输数据。应使用Ajax在客户端显示数据。在服务器端,将使用PHP和MySQL解析请求,获取数据,然后将其发送回 然后问题来了。从浏览器发送的用户数据可能包含&、%、'、“,这可能会损坏格式化的POST请求或进行数据库攻击。虽然我们可以使用JS检测它们,但用户仍然可以绕过验证发送数据,更不用说我们不能简单地删除它们,因为它们可能对用户有用 然后我检查了我的武器库。 在服务器端,我有太多的

嗯,我是PHP新手,但是最近想到这些东西真的让我很困惑

以下是我的详细问题:

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

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

然后我检查了我的武器库。 在服务器端,我有太多的函数来处理它们:
除了正常的工作外,我还有

htmlspecialchars, htmlspecialchars_decode, addslashes, stripslashes
urlencode, urldecode, mysql_escape_string, mysql_real_escape_string
在使用javascript的客户端,我没有那么多,但仍然有:

escape, unescape
好的。知道我有这么多武器是很好的,但是……如何选择、组合和使用它们对我来说真的是一件头疼的事

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

'%Hooray%+&ABC

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

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

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


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

服务器端您想要的是,也称为参数化查询,以确保数据库安全(避免SQL注入)


客户端,我建议JSON使用已定义的对象和DOM操作,而不是innerText或innerHTML。浏览器将逃避执行post所需的一切。

服务器端需要的是,也称为参数化查询,以确保数据库安全(避免SQL注入)


客户端,我建议JSON使用已定义的对象和DOM操作,而不是innerText或innerHTML。浏览器将跳过所有需要的内容,以便进行发布。

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

for(i in arr)
   { arr[i] = encodeURIComponent(arr[i]); }
函数将替换所有有害的url字符(,/?:@&=+$#)以及其他一些字符。 然后,您可以通过像
arr.join(“”);
但是我会使用jquery,然后立即发送数组


PHP端您必须遵守的基本规则是,在通过ajax发送数据之前,您必须在没有
mysql\u real\u escape\u string();
的情况下保存数据,并对其进行编码: 假设数据是一个javascript数组。 为什么是数组? 因为如果您已经有了一个查询(例如'name=me&foo=b&ar'),那么您如何解决这个'b&ar',这个'b&ar'对于您来说显然是一个值,但是对于javascript引擎来说是'b'和'ar'呢

for(i in arr)
   { arr[i] = encodeURIComponent(arr[i]); }
函数将替换所有有害的url字符(,/?:@&=+$#)以及其他一些字符。 然后,您可以通过像
arr.join(“”);
但是我会使用jquery,然后立即发送数组


PHP方面您必须遵守的基本规则是在没有
mysql\u real\u escape\u string()的情况下绝不保存数据

encodeURIComponent
是客户端清理的正确答案。但是,您建议使用
mysql\u real\u escape\u string
建议使用
mysql\ucode>或
mysqli\ucode>函数,在我看来,这不是正确的现代答案。关于这一点,请参阅@jmoreno关于使用PDO.yes.PD的极好建议O当然是正确的,但如果答案中有“PDO”一词,那么在没有提供实际解决方案而不是理论的情况下,该答案是如何变得“优秀”的呢?他建议使用PDO是一个很好的建议,因为这是现代的最佳实践——这是正确的。他还参考了客户端的几种最佳实践技术。如果你的答案也提到PDO而不是过时的
mysql\uuu
函数,它也会很好。你们都从我这里得到了+1,所以我不明白为什么你们会对我对另一个答案中更好的方面的赞扬表示异议。这个问题是理论性的,没有给出细节。谢谢大家。但如果这个函数单独起作用,为什么我们还需要其他函数呢?还有很多“需要”中没有任何内容;每个函数都处理一个特定的问题;mysql_real_escape_string()只在调用和数据库保存级别上转义有害字符,htmlspecialchars()将转换为html实体(不需要,而且在安全性上绝对不具有与上述相同的权重),这对于手工构建XML文件非常有用(仅举一个例子)综上所述,你打败讨厌角色的武器应该是JS的encodeURIComponent和mysql_real_escape_string()对于PHP/Mysql。是的,跳转到mysqli或pdo以减少这些问题。
encodeURIComponent
是客户端清理的正确答案。但是,您建议使用
Mysql\u real\u escape\u string
建议使用
Mysql\ucode>或
mysqli\ucode>函数,这在我看来不是一个正确的现代答案。因此,请看@jmoreno关于使用PDO的极好建议。是的,PDO确实是一种方式,但答案中包含“PDO”一词如何成为“极好”的智慧