RegEx避免用户输入注入

时间:2010-12-31 08:46:11

标签: regex sql-injection validation code-injection

收到用户的输入后,我在我的服务器上执行以下操作(使用PHP):

$safe_input = ereg_replace("[^A-Za-z0-9-]", "", $_GET["input"]); 

然后我使用$ safe_input变量进行SQL查询,并将其打印到用户的屏幕上。

这是否可以保证不可能注入任何类型(SQL注入,XSS等)?

谢谢,

乔尔

2 个答案:

答案 0 :(得分:2)

嗯,它的作用是确保你只允许A-Z(上部或下部),数字和$safe_input字符串中的“ - ”短划线字符。

理论上,你的SQL仍然可以被某人添加“ - ”来强行输入,以便强制将语句的后半部分视为SQL注释。

像您发布的内容一样简单并不是恶意代码注入的解决方案 - 并且当您希望允许用户发送除您明确允许的字符之外的其他字符时,很可能会引发问题。

你应该看看专门处理这类事情的第三方PHP库 - 有很多SQL和XSS预防。或者甚至查看服务器级别并考虑添加一个可用于此任务的Apache模块(假设您当然使用Apache ...)。沿着这条路走下去,你将采取更全面的保护方法 - 你将利用这方面的专业知识,而不是试图为你的项目重新发明这个特定的轮子。

答案 1 :(得分:1)

首先,不推荐使用ereg函数系列,而应使用preg函数系列代替:


用户限制为A-Za-z0-9-。我建议你去找:

  

HTML Purifier符合标准   用PHP编写的HTML过滤器库。   HTML Purifier不仅会删除所有内容   恶意代码(俗称为   XSS )经过全面审核,
  它安全但宽容的白名单   还将确保您的文件   符合标准,只有一些东西   可以全面实现   了解W3C的规范。

您可以自定义接受的内容和拒绝的内容。


<强>有趣:

有趣的是,Kohana CodeIgniter的改进替代方案也支持HTML Purifier以提高安全性。


至于 SQL注入,您可以做的最少的事情就是使用mysql_real_escape_string功能。更好的方法是使用prepared statements