Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 检测潜在的SQL注入攻击以及其他安全问题_Php_Sql_Regex_Security_Sql Injection - Fatal编程技术网

Php 检测潜在的SQL注入攻击以及其他安全问题

Php 检测潜在的SQL注入攻击以及其他安全问题,php,sql,regex,security,sql-injection,Php,Sql,Regex,Security,Sql Injection,我们都知道,制作一个没有一两个缺陷的大型网站几乎是不可能的。因此,我编写了一个小型监视器,用于检查Apache访问日志中是否存在潜在的SQL注入攻击(以及其他攻击),它工作得非常好。每当有人试图进行攻击时,我都会收到一个警报,我几乎没有误报,现在的默认操作是将它们转储到iptables下拉列表中。它甚至帮助我识别了一些(非安全)bug并将其删除 以下是我的规则(不区分大小写): 我想知道的是,你如何绕过这些检查,仍然生产有效的注射剂?你能想出一种在不引入误报的情况下改进它们的方法吗 请注意:

我们都知道,制作一个没有一两个缺陷的大型网站几乎是不可能的。因此,我编写了一个小型监视器,用于检查Apache访问日志中是否存在潜在的SQL注入攻击(以及其他攻击),它工作得非常好。每当有人试图进行攻击时,我都会收到一个警报,我几乎没有误报,现在的默认操作是将它们转储到iptables下拉列表中。它甚至帮助我识别了一些(非安全)bug并将其删除

以下是我的规则(不区分大小写):

我想知道的是,你如何绕过这些检查,仍然生产有效的注射剂?你能想出一种在不引入误报的情况下改进它们的方法吗



请注意:

  • 区分大小写功能已关闭
  • 我正在使用MySQL
  • Havij和r3dm0v3条目用作一个包罗万象的工具,以防止使用这些自动化工具
  • 我正在检查原始字符串和URL解码字符串
  • 我不是在寻找像“生成更安全的代码”这样的答案
  • 我不是在寻找一种不同的方法来实现这一点,只是想改进我目前的逻辑
编辑:
好吧,人们似乎误解了我的意图。那可能是我的错,因为我没有充分解释。这被要求作为监控产品的附加功能,旨在提供最低限度的安全监控。作为我们与客户对话和文档的一部分,我们强调,这不是一个包罗万象的解决方案,也不是适当安全基础设施(如IDS和防火墙)的替代品。它只是一种信息服务,帮助提供基本的威胁检测,并生成有关潜在攻击数量的统计数据。我不想写一个ID或防火墙。如果由我决定的话,我会放弃这个功能,告诉他们去安装一套完整的安全基础设施和自己的监控系统,但这不是我的决定。目前的情况是,我一直在自己的网站上测试该系统。现在,我正在寻找一种改进正则表达式字符串的方法,使其更有效。希望这能把事情弄清楚一点


在2021年6月再次编辑。

我在2011年发布了这个问题。当我写它的时候,我是一个对安全感兴趣但缺乏经验的初级开发人员。从那以后,我转行从事安全工作,做了五年的pentester,又做了两年的安全研究员。我也是世界上声誉最好的用户之一

这里给出的答案基本上是正确的,因为他们已经完成了工作,所以部署类似于使用适当规则的东西更有价值。一个附加的自制解决方案无法与一个成熟度近20年的项目相比

不过,一个主要的警告是,我没有做出决定。初级开发人员通常既没有特权也没有自由否决管理层做出的产品决策,尤其是那些应客户要求做出的决策。人们当然可以解释为什么一个想法是不好的,并提供支持材料,但这通常不会转化为改变的决定。能够毫无后果地拒绝雇主的任务是一种不同寻常的特权——在大多数就业情况下,这一概念完全是一种幻想

我对回答这类问题的人的建议是:解释为什么这是不明智的,但要同情和帮助那些处于困境的人。尽可能地回答这个问题,以便在其他一切都失败的情况下,尽最大努力实施解决方案。在安全特性方面,还值得考虑的是,如果替代方案根本没有保护或检测——即使该替代方案是由外部参与者人为施加的——那么弱能力几乎总是比根本没有能力要好

我不记得我最终实现了什么。那是很久以前的事了。但是如果你现在在这里寻找答案,我建议你使用ModSecurity。他们现在有用于Apache、nginx和IIS的连接器,因此您可以在这些web服务器上安装它。如果更改服务器配置有问题,您可以将nginx作为启用ModSecurity的反向代理运行,以便用户点击nginx服务器并将请求代理到实际的web服务器。这也可以用Apache代替

如果你在寻找一种更为程序化的方法,MMOSSAID有C、C++和Python的语言绑定。ModSecurity API还可以通过任何支持C API互操作性的语言使用(例如.NET中的P/Invoke或Java中的JNI)

ModSecurity根据规则工作。其中一条最好的自由法则就是。这些规则比简单的正则表达式模式要强大得多。这使得它们非常有效,但也意味着你可能不应该尝试构建你自己的ModSecurity类内部功能来使用规则,因为你需要投入大量的工作来支持所有必要的功能

如果您需要将ModSecurity日志解析为可以自动执行的格式,请查看


希望这些信息对将来的人有用。

你说的是写一个ID。除非您的产品是IDS,否则只需获取并安装一个。是众所周知的,有一个免费版本

我不是在寻找一种不同的方法来实现这一点,只是想改进我目前的逻辑


有时候,当涉及到安全性时,错误的方法就是。我怎么会弄乱你现在的逻辑?Unicode或十六进制编码。

sql注入是当今最热门的web应用程序攻击。网络上有许多不安全的代码,还有几种方法可以保护应用程序免受sql注入攻击。当应用程序使用输入构造动态sql语句时,可能会发生sql注入
PathInjection = \./\.\./(bin|boot|data|dev|etc|home|lib|lib64|media|mnt|opt|proc|root|sbin|selinux|srv|sys|tmp|usr|var)/

Havij = 0x31303235343830303536

r3dm0v3 = 0x7233646D3076335F68766A5F696E6A656374696F6E

LogicBypass = '.*?(\bor|\band|\bxor|\|\||\&\&).*?--

UnionSelect = union[^a-z-_]+((all|distinct)[^a-z-_]+)?select[^a-z-_]