嗯,我是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注入 %标记可能会导致问题,但我不确定是否会出现问题。
但是在将它发送到数据库并将其取回后,我仍然希望该名称完全相同,
这意味着,数据库中的名称可能不同,但它在浏览器中的显示应该是相同的。
这个问题可能有点太长了,但希望有人可以分享一些好的经验:如何使用这些功能处理用户输入字符串?
答案 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();