PHP中SQL注入的验证和检测
我是PHP新手,还不熟悉它的工作原理PHP中SQL注入的验证和检测,php,mysqli,sql-injection,Php,Mysqli,Sql Injection,我是PHP新手,还不熟悉它的工作原理 如果我使用mysqli\u real\u escape\u string()并对SQL查询中的每个变量进行参数化,我可以用is\u numeric()等进行验证吗 创建注射检测系统的最佳方法是什么?只需使用正则表达式验证用户的输入并将其保存在数据库中 参数化查询就足够了,您不需要其他任何东西。您将输入他们“注入”的内容作为字符串,并且数据库中的sql没有什么特别的错误。。。我怀疑苏的数据库中充满了SQL;) 即使通过使用参数化查询或mysql\u real\
mysqli\u real\u escape\u string()
并对SQL查询中的每个变量进行参数化,我可以用is\u numeric()
等进行验证吗参数化查询就足够了,您不需要其他任何东西。您将输入他们“注入”的内容作为字符串,并且数据库中的sql没有什么特别的错误。。。我怀疑苏的数据库中充满了SQL;) 即使通过使用参数化查询或
mysql\u real\u escape\u string()
(而不是mysql\u escape\u string()
)保护变量不被注入,您仍然应该在服务器端验证它们,以确保它们与预期的输入类型匹配。这样,如果他们不这样做,您可以向用户返回一条错误消息,请求重试这些表单字段
如果使用参数化查询,例如MySQLi提供的预处理语句,则不需要对字符串进行转义。但是,如果不使用参数化查询,则必须对PHP接收到的每个输入参数调用
mysql\u real\u escape\u string()
。这是一个好问题,我认为避免SQL注入的最佳方法之一是了解如何正确使用
这些将真正有助于提高应用程序的安全性。sql注入的问题是用户将sql数据插入到命令中,而没有验证数据是否符合您的业务规则
确保所有用户数据都通过mysqli\u real\u escape\u字符串或使用准备好的语句传递是避免问题的最佳方法 对MySQL的值进行转义只需在以下字符前面添加一个反斜杠:
NULL
\n
\r
”
“
和0x1A
。它不做任何其他事情
“转义”值在SQL中的使用并不是神奇的安全。转义可以防止特殊字符(如引号)被误解。但是,如果在SQL查询中插入转义值而不将其括在引号中,则您完全没有抓住要点,并且您也不会比其他情况下更安全
请记住,安全过程是“引用”和“转义”。您应该始终同时使用这两种方法,因为如果没有另一种方法,这两种方法都不安全
此外,如果您可以绝对保证输入值不包含上述任何字符,那么您还可以确定转义字符串将始终与未转义字符串相同,因此在这些条件下转义没有其他用途
但更重要的是:
最后,回顾过去,我们意识到SQL从安全角度来看设计得很糟糕,依赖用户正确引用和转义他们的数据是一个非常糟糕的想法
参数化查询是解决方案,因为它可以安全地将数据与控制结构分离。mysqli可以使用参数化查询,方法是使用后跟。使用此方法时无需转义。您可以确信自己绝对不会受到SQL注入攻击。可能重复在提到PDO时可能会重复+1,这比使用这些旧的过程API要好得多