表明SQL语句很危险

时间:2010-05-07 22:34:12

标签: php security sql-injection

我想在PHP中开发一个函数来检查SQL语句的危险程度。当我说危险时,我的意思是,某些符号,字符或字符串用于从数据库中获取用户看不到的数据。

例如:

SELECT * FROM users WHERE userId ='1'

可以通过多种方式注入。虽然我清理了params,但我也希望监控查询运行的安全性。

提前致谢

5 个答案:

答案 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)

您需要关注三个方面:

  1. 清理您的输入。事实并非如此 它意味着剥离字符 意味着定义可接受的。 白名单和拒绝例外
  2. 用户参数化的SQL语句 而不是建立一个 串联的语法和字符串 值。
  3. 保护数据层 可以通过应用原则 最小特权和限制 公共用户只能访问 绝对必要的功能即 不允许写入访问许多 表格。
  4. 您可能会觉得这很有用:OWASP Top 10 for .NET developers part 1: Injection

    它是为.NET开发人员编写的,但原则同样转移到PHP。