使用PHP在一个字符串中搜索多个令牌的最有效方法是什么?

时间:2014-05-01 16:28:41

标签: php

我们想检查所有传入的GET / POST数据是否存在恶意代码。如果检测到,我们想要从服务器发出禁令。虽然搜索了所有数据,但我对性能有点担心。

使用PHP,我们目前正在做这样的事情:

$t = $_POST['example'];
if(
    (strpos($t, 'hex') && strpos($t, 'unhex')) || 
    (strpos($t, 'etc') && strpos($t, 'passwd')) || 
    strpos($t, 'information_schema')
  )
  // Initiate ban of IP

有更有效的方法吗?目标是不要将资源浪费在错误的请求上。"我们使用准备好的陈述,因此它是一个性能问题而不是安全性。黑名单发生在Juniper级别,这意味着数据库服务器,文件服务器等在最初的错误请求之后根本不会紧张。

仅供参考:像OSSEC这样的节目在平局上太慢了。它们通常允许20-40个请求在实际响应并开始禁止过程之前得到处理。在应用程序层,我们可以捕获第一个请求。这可能看起来无关紧要,但是当你被100多个IP地址攻击时,捕获第一个请求会产生很大的不同。

1 个答案:

答案 0 :(得分:0)

您正在做的是将您可能通过表单收到的某些表达列入黑名单。 这不是最有效的做法,因为攻击者可以使用您未考虑的替代方案,以绕过您的控制。

防止sql注入的最佳做法是根据您要允许的内容将内容列入白名单。

以下内容来自Cisco website on SQL injection

  

在应用程序本身中,有两种输入方法   可以抵御SQL注入攻击的验证:黑名单   和白名单。有黑名单,具体,已知恶意   用户输入中删除或替换字符。虽然这个   方法通常是实施的,主要是因为它可以很容易   完成后,与白名单相比,它没有效果。   黑名单可能无法正确处理复杂的混淆   可能允许攻击者破坏过滤器并可能注入SQL   声明。这种失败通常是由于攻击的演变而发生的   技术和过滤器不全面或未实现   正确。

     

或者,白名单会根据a检查每个用户输入   允许的字符列表。这种方法更有效   减轻SQL注入的风险,因为它更具限制性   关于允许哪种类型的输入。实现良好的   白名单应检查每个用户提供的数据   预期的数据格式。

根据您使用的方法类型以及您希望接收的数据类型,您将有不同的性能来检查SQL注入。