2012-02-02 57 views
-1

我正在为MySQL查询使用ezSQL PHP类。由于我的所有查询都通过$ezsql->query()函数,所以我认为实现一种方法来阻止$ezsql->query()中的常用SQL注入技术是个好主意。检测查询中的常见SQL注入模式

例如,最常见的可能是1=1。所以这个正则表达式应该能够阻止所有的变化:

preg_match('/(?:"|\')?(\d)(?:"|\')?=(?:"|\')?\1(?:"|\')?/',$query); 

这将阻止"1"="1"'1'=11=1

这是一个好主意?如果是这样,还有其他一些常见模式?

编辑:忘了提及,我确实使用验证和卫生。这只是一个额外的预防措施。

+7

一个更好的想法是使用允许你做准备语句+参数绑定的东西,这样可以完全避免最常见的攻击。 – Amber 2012-02-02 05:07:01

回答

3

这是个好主意吗?

号有两个原因:

  1. 你这样做是错误的(是的,你只是失败,你生了一个SQL黑名单的做法)。不,我不会告诉你如何改进,因为2:
  2. 这是一个黑名单方法。数据库类本身不应该使用黑名单方法。这不是预先警告,它只是没用。例如,可以在网络服务器的请求级别额外添加黑名单。

改为使用现有的黑名单,不要重新发明轮子。如果您想了解如何开发自己的SQL黑名单层,请帮助开发这些现有组件。这种安全性不是开箱即用的,因此您可以抛出类似于您的问题,并且实际上您可以期待具体的答案。保重。

2

这是个好主意吗?

肯定没有。

每一次我在互联网论坛上看到这样的建议,我想知道,如果这个论坛运行的软件遵循这样的模式怎么办?一个可怜的发明者将无法提出他们的解决方案,因为软件会阻止这个帖子!

额外的预防措施不会伤害。比对不起更安全。

正如我在上面指出的,它显然很痛。无法处理某些奇数部分数据的数据库是无稽之谈。

此外,我确信只有知识可以让你安全。
不随意移出一些模糊的想法,但理智而合理的行动。

只要您转移并引用转到查询的数据,并且只要您为转义函数设置了正确的编码,就没有理由感到悲伤。
只要您使用准备好的语句将数据添加到查询中,就没有理由感到悲伤。
只要您根据硬编码白名单过滤SQL标识符和关键字,就没有理由感到悲伤。