Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.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 预匹配杀死页面_Php_Regex_Preg Match_Pcre - Fatal编程技术网

Php 预匹配杀死页面

Php 预匹配杀死页面,php,regex,preg-match,pcre,Php,Regex,Preg Match,Pcre,我正在使用preg_match查找并删除文件中的evaled base64编码病毒 正则表达式如下: /\s*eval\s*\(\s*base64_decode\s*\(\s*('[a-zA-Z0-9\+\/]*={0,2}'|"[a-zA-Z0-9\+\/]*={0,2}")\s*\)\s*\s*\)\s*(;)?\s*/ 匹配以下代码: eval(base64_decode("BASE64+ENCODED+VIRUS+HERE")); 上述正则表达式可以正常工作 我想通过连接匹配bas

我正在使用preg_match查找并删除文件中的evaled base64编码病毒

正则表达式如下:

/\s*eval\s*\(\s*base64_decode\s*\(\s*('[a-zA-Z0-9\+\/]*={0,2}'|"[a-zA-Z0-9\+\/]*={0,2}")\s*\)\s*\s*\)\s*(;)?\s*/
匹配以下代码:

eval(base64_decode("BASE64+ENCODED+VIRUS+HERE")); 
上述正则表达式可以正常工作

我想通过连接匹配base64字符串。因此,它也应该与下面的“BASE64+EN”匹配。“编码+病毒+此处”

因此,我将正则表达式改为:

/\s*eval\s*\(\s*base64_decode\s*\(\s*\'([a-zA-Z0-9\+\/]*(\'\s*\.\s*\')?[a-zA-Z0-9\+\/]*)*={0,2}\'|"([a-zA-Z0-9\+\/]*("\s*\.\s*")?[a-zA-Z0-9\+\/]*)*={0,2}"\s*\)\s*\s*\)\s*(;)?\s*/
它查找以下项的部分匹配:

"BASE64+ENCODED+VIRUS+HERE"));
但当我尝试在整个文件上应用匹配时:页面死亡,浏览器消息为“页面加载时服务器连接已重置”

我已激活错误报告:

error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('scream.enabled', TRUE);
但是,这里和apache的错误日志中都没有显示任何内容

当在不包含违规字符串的文件上使用相同的正则表达式时,其工作原理与预期相同;preg_match不返回布尔值false。它返回0表示没有正则表达式错误,并且未找到任何匹配项

我关心的不一定是为什么正则表达式只能找到部分匹配。这可能是我的打字错误,正好有用

我想知道正则表达式编译器何时以及如何失败,从而破坏整个进程链

apache > php > regex_compiler
我理解这很可能是因为我的正则表达式恰好正确编译了,但没有正确匹配。这可能会导致一些不好的事情。但我感兴趣的是为什么正则表达式编译器失败而没有错误,以及如何获得应该产生的错误消息


这里讨论了一些类似的问题,但没有解决:

我认为您的正则表达式有很多可能匹配==>

正则表达式需要很多步骤来匹配我标记的部分==>如果您有性能问题,正则表达式就是不能及时完成

由于
(\'\s*\.\s*\')?
是可选的,因此需要很多步骤,直到正则表达式找到与可选部分之前和之后的
[a-zA-Z0-9\+\/]*
匹配的内容

你能做的就是使用(在量词后面加一个
+
,使量词具有所有格)。它们防止回溯,并且所有格量词不会返回匹配的字符。那么,试试这个

/\s*eval\s*\(\s*base64_decode\s*\(\s*\'([a-zA-Z0-9\+\/]*+(\'\s*\.\s*\')?[a-zA-Z0-9\+\/]*+)*={0,2}\'|"([a-zA-Z0-9\+\/]*+("\s*\.\s*")?[a-zA-Z0-9\+\/]*+)*={0,2}"\s*\)\s*\s*\)\s*(;)?\s*/
                                                       ^^                               ^^                           ^^                            ^^

我认为你的正则表达式有很多可能匹配==>

正则表达式需要很多步骤来匹配我标记的部分==>如果您有性能问题,正则表达式就是不能及时完成

由于
(\'\s*\.\s*\')?
是可选的,因此需要很多步骤,直到正则表达式找到与可选部分之前和之后的
[a-zA-Z0-9\+\/]*
匹配的内容

你能做的就是使用(在量词后面加一个
+
,使量词具有所有格)。它们防止回溯,并且所有格量词不会返回匹配的字符。那么,试试这个

/\s*eval\s*\(\s*base64_decode\s*\(\s*\'([a-zA-Z0-9\+\/]*+(\'\s*\.\s*\')?[a-zA-Z0-9\+\/]*+)*={0,2}\'|"([a-zA-Z0-9\+\/]*+("\s*\.\s*")?[a-zA-Z0-9\+\/]*+)*={0,2}"\s*\)\s*\s*\)\s*(;)?\s*/
                                                       ^^                               ^^                           ^^                            ^^

编辑:

 \s*
 eval \s*
 \( \s*
    base64_decode \s* 
    \( \s* 
        (?:
            (?>
               '
                 [a-zA-Z0-9+/]*
                 (?:
                    '
                      \s* \. \s*
                    '
                    [a-zA-Z0-9+/]*
                 )*
                 ={0,2}
               '
            )
          |
            (?>
               "
                 [a-zA-Z0-9+/]*
                 (?:
                    "
                      \s* \. \s*
                    "
                    [a-zA-Z0-9+/]*
                 )*
                 ={0,2}
               "
            )
        )
        \s*

    \)\s*

 \)\s* ;? \s*
如何处理“.”链接

 \s*
 eval \s*
 \( \s*
    base64_decode \s* 
    \( \s* 
        (?:
            (?>
               '
                 [a-zA-Z0-9+/]*
                 (?:
                    '
                      \s* \. \s*
                    '
                    [a-zA-Z0-9+/]*
                 )*
                 ={0,2}
               '
            )
          |
            (?>
               "
                 [a-zA-Z0-9+/]*
                 (?:
                    "
                      \s* \. \s*
                    "
                    [a-zA-Z0-9+/]*
                 )*
                 ={0,2}
               "
            )
        )
        \s*

    \)\s*

 \)\s* ;? \s*
您没有尝试解析该语言(您无法使用它),因此您可以
使用此非常快速的正则表达式处理连锁条件
“.”

~
 \s*
 eval \s*
 \( \s*
    base64_decode
    \s* 
    \(
       \s* 
        ["']
        (?> [a-zA-Z0-9+/]* (?: ["']\s*\.\s*["'] [a-zA-Z0-9+/]* )* )
        ={0,2}
        ["']
       \s*
    \)
    \s*
 \)
 \s* ;? \s*

~x

编辑:

 \s*
 eval \s*
 \( \s*
    base64_decode \s* 
    \( \s* 
        (?:
            (?>
               '
                 [a-zA-Z0-9+/]*
                 (?:
                    '
                      \s* \. \s*
                    '
                    [a-zA-Z0-9+/]*
                 )*
                 ={0,2}
               '
            )
          |
            (?>
               "
                 [a-zA-Z0-9+/]*
                 (?:
                    "
                      \s* \. \s*
                    "
                    [a-zA-Z0-9+/]*
                 )*
                 ={0,2}
               "
            )
        )
        \s*

    \)\s*

 \)\s* ;? \s*
如何处理“.”链接

 \s*
 eval \s*
 \( \s*
    base64_decode \s* 
    \( \s* 
        (?:
            (?>
               '
                 [a-zA-Z0-9+/]*
                 (?:
                    '
                      \s* \. \s*
                    '
                    [a-zA-Z0-9+/]*
                 )*
                 ={0,2}
               '
            )
          |
            (?>
               "
                 [a-zA-Z0-9+/]*
                 (?:
                    "
                      \s* \. \s*
                    "
                    [a-zA-Z0-9+/]*
                 )*
                 ={0,2}
               "
            )
        )
        \s*

    \)\s*

 \)\s* ;? \s*
您没有尝试解析该语言(您无法使用它),因此您可以
使用此非常快速的正则表达式处理连锁条件
“.”

~
 \s*
 eval \s*
 \( \s*
    base64_decode
    \s* 
    \(
       \s* 
        ["']
        (?> [a-zA-Z0-9+/]* (?: ["']\s*\.\s*["'] [a-zA-Z0-9+/]* )* )
        ={0,2}
        ["']
       \s*
    \)
    \s*
 \)
 \s* ;? \s*

~x

我我想你也有类似的问题,但我还是试着理解你的正则表达式。我想你也有类似的问题,但我仍然试图理解你的正则表达式。聪明的朋友,它确实解决了性能问题。我猜这与我输入的260k base64编码病毒有关。我只是没有在“时间”域中考虑它,而是在记忆域中考虑它。我想到了使用[a-zA-z]*?对于一个懒惰的匹配(作为一个性能增强),但在我测试它并没有看到任何变化后,我忘记了回溯需要时间!聪明的伙伴,它确实解决了性能问题。我猜这与我输入的260k base64编码病毒有关。我只是没有在“时间”域中考虑它,而是在记忆域中考虑它。我想到了使用[a-zA-z]*?对于一个懒惰的匹配(作为一个性能增强),但在我测试它并没有看到任何变化后,我忘记了回溯需要时间!这会很有趣,@stema在表演中修复了整个裂口,你可能在准确性上修复了这个。我还没有测试你的解决方案。我的代码基于eval+base64+gzflate/gzuncompress/bzdecompress+str_rot13的多种组合生成正则表达式,它还考虑了隐藏在ascii十六进制码/unicode十六进制码下的字符串。这一切都使得合并您的解决方案变得困难。因此我会在早上做。因为你的代码保留了性能问题,我的问题是“为什么我的正则表达式崩溃了”,我想我会接受@stema关于“灾难性回溯”的回答。@Mihai Stancu-没问题,很高兴你让它工作了。我本以为从
([a-zA-Z0-9\+\/]*(\'\s*.\s*')?[a-zA-Z0-9\+\/]*
[a-zA-Z0-9+/]*(?:'\s*.\s*.[a-zA-Z0-9+/]*)*
不会在失败时造成太多回溯。我将您的文件加载到2.4兆字节,在末尾插入了一个“=”符号(但无效)。失败只花了1/2秒,你的就挂了。所以我添加了原子分组,现在失败需要1/4秒。代码在我的编辑中。我还发布了你的正则表达式和一个问题。-祝你好运还有一件事,是什么阻止catenation使用这两种形式的base64代码呢。这个“([a-zA-Z0-9\+\/]*(“\s*.\s*”)?[a-zA-Z0-9\+\/]*)*={0,2}”是双引号base64代码,可以用双QOUTE拆分。还有一个是单引号的,可以用单引号分开。这会很有趣,@stema在性能上修复了整个缺口,你可能在准确性上修复了这个。我还没看过电影