【问题标题】:Detecting common SQL injection patterns in a query在查询中检测常见的 SQL 注入模式
【发布时间】:2012-02-02 05:03:39
【问题描述】:

我正在使用 ezSQL PHP 类进行 MySQL 查询。由于我的所有查询都通过$ezsql->query() 函数,我认为最好实现一种方法来阻止来自$ezsql->query() 的常见SQL 注入技术。

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

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

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

这是个好主意吗?如果有,还有哪些其他常见的模式?

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

【问题讨论】:

  • 一个更好的主意是使用一些允许你做准备好的语句+参数绑定的东西,这将完全避免最常见的攻击。

标签: php mysql sql regex sql-injection


【解决方案1】:

这是个好主意吗?

没有。有两个原因:

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

改为使用现有的黑名单,不要重新发明轮子。如果您想学习如何开发自己的 SQL 黑名单层,请帮助开发此类现有组件。这种安全性不是开箱即用的,因此您只需提出像您这样的问题,您实际上就可以期待具体的答案。保重。

【讨论】:

    【解决方案2】:

    这是个好主意吗?

    绝对没有。

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

    额外的预防措施不会造成伤害。安全总比后悔好。

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

    此外,我相信只有知识才能让你安全。
    不是出于一些模糊的想法而随机采取的行动,而是理智和合理的行动。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 2015-07-08
      相关资源
      最近更新 更多