我想在PHP中开发一个函数来检查SQL语句的危险程度。当我说危险时,我的意思是,某些符号,字符或字符串用于从数据库中获取用户看不到的数据。
例如:
SELECT * FROM users WHERE userId ='1'
可以通过多种方式注入。虽然我清理了params,但我也希望监控查询运行的安全性。
提前致谢
答案 0 :(得分:13)
您正在尝试找到不应存在的问题的修复程序。您应该使用准备好的(预编译的)查询,然后您不必担心SQL注入和转义,因为查询本身是固定的,只有参数是可变的。
请参阅此处,了解有关在PHP中使用它们的示例:http://mattbango.com/notebook/web-development/prepared-statements-in-php-and-mysqli/
另一个优点是它也更快,至少对于MySQL来说,因为服务器不必每次都解析查询。
答案 1 :(得分:2)
我同意参数化查询是最好的方法。但是大多数php / mysql应用程序都使用mysql_query(),并且大多数Web应用程序也容易受到某种形式的sql注入攻击。
Suhosin Hardened PHP默认安装在许多LAMP系统上,它有一个名为"experimental SQL injection heuristics"的功能,但它不会破坏我所知道的任何漏洞。更好的解决方案是Web Application Firewalls(WAF),它正在寻找原始HTTP查询中的sql注入等攻击。 PCI-DSS要求WAF是当今互联网上常用的,因为它们有效。
有一个名为GreenSQL的应用程序正在押注注入查询look different的事实。在大多数情况下,这是一个安全的选择,但SQL是一种自由形成的声明性语言,攻击者可以通过多种方式重写查询以执行相同的攻击。简而言之,这种类型的secuirty会阻止一些攻击,但与Parametrized Queries相比它有缺陷。 WAF遇到与GreenSQL相同的问题,它可能对攻击进行编码或混淆,使其滑过用于检测攻击的大量正则表达式库。 Bobince's answer to this question让我感到震惊,他的观点也适用于剥削过程。
答案 2 :(得分:1)
这个article有一些防止sql注入的好例子,以及对sql注入问题的很好的解释。
答案 3 :(得分:1)
你没有“清理”params。这会打破你的数据。为什么不允许有人打电话给“O'Reilly”将他们的名字输入你的数据库?
要将任何字符串放入SQL字符串文字中,您需要对其进行转义,或者更好地使用参数化语句,这样您就不必担心SQL注入。输入端的“消毒”是错误的方法:它增加了不必要的限制,并没有解决整个问题。
如果您正在创建一个SQL语句,其中包含任何变量字符串,而您尚未进行转义,那么它是不安全的,句点。无论是最简单的SELECT *
,还是大量复杂的连接和子查询,只需要一次注入就可以让你容易受到攻击。
答案 4 :(得分:1)
您需要关注三个方面:
您可能会觉得这很有用:OWASP Top 10 for .NET developers part 1: Injection
它是为.NET开发人员编写的,但原则同样转移到PHP。