我是PHP的新手,还不熟悉它是如何工作的。
如果我使用mysqli_real_escape_string()
并参数化SQL查询中的每个变量,我是否可以自己使用is_numeric()
等进行验证?
创建注射检测系统的最佳方法是什么?只需使用正则表达式填充用户的输入并将其保存在数据库中?
答案 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传递或使用预准备语句是避免问题的最佳方法。