Php 预匹配杀死页面
我正在使用preg_match查找并删除文件中的evaled base64编码病毒 正则表达式如下: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
/\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在性能上修复了整个缺口,你可能在准确性上修复了这个。我还没看过电影