PHP中SQL注入的验证和检测

时间:2011-06-25 20:24:37

标签: php mysqli sql-injection

我是PHP的新手,还不熟悉它是如何工作的。

  1. 如果我使用mysqli_real_escape_string()并参数化SQL查询中的每个变量,我是否可以自己使用is_numeric()等进行验证?

  2. 创建注射检测系统的最佳方法是什么?只需使用正则表达式填充用户的输入并将其保存在数据库中?

5 个答案:

答案 0 :(得分:4)

参数化您的查询就足够了,您不需要任何其他内容。你会输入他们“注入”字符串的东西,并且数据库中的sql没有什么特别的错误...我怀疑SO的数据库充满了SQL;)

答案 1 :(得分:3)

转义MySQL的值只是在以下字符前添加反斜杠:NULL \n \r \ ' "0x1A。它没有别的。

“转义”值在SQL中使用并不神奇。转义可防止特殊字符(如引号)被误解。但是,如果您将一个转义值插入到SQL查询中而不用引号括起来,那么您就完全错过了这一点,并且您不会比原本更安全。

请记住,安全程序是 引用和转义 。你应该总是将这两者结合使用,因为没有另一个就不能安全。

此外,如果您绝对可以保证您的输入值不包含上述字符,那么您也可以确定您的转义字符串将始终与未转义字符串完全相同,因此在这些条件下转义不会产生额外用途

但更重要的是:

最后,我们回想起,从安全角度来看,SQL的设计很差,依靠用户正确引用和转义数据只是一个非常糟糕的主意。

参数化查询是解决方案,因为它可以安全地将数据与控制结构分开。使用prepare()后跟bind_param(),可以使用mysqli进行参数化查询。 使用此方法时无需转义 ,您可以确信自己完全免受SQL注入攻击。

答案 2 :(得分:2)

即使您使用参数化查询或mysql_real_escape_string()(而非mysql_escape_string())保护您的变量不受注入,您仍应在服务器端验证它们以确保它们与预期的类型相匹配输入。这样,如果他们不这样做,您可以向用户返回一条错误消息,请求重试这些表单字段。

如果使用参数化查询(例如MySQLi提供的预编译语句),则无需转义字符串。但是,如果不使用参数化查询,则必须在PHP接收的每个输入参数上调用mysql_real_escape_string()

答案 3 :(得分:1)

这是一个很好的问题,我认为避免SQL注入的最佳方法之一是了解正确使用prepared statements

这些将真正有助于您的应用程序的安全性。

答案 4 :(得分:0)

sql注入的问题是用户将SQL数据插入命令而不验证数据是否符合您的业务规则。

确保所有用户数据都通过mysqli_real_escape_string传递或使用预准备语句是避免问题的最佳方法。