我正在使用preg_match来查找和删除文件中的evaled base64编码病毒。
正则表达式bewlow:
/\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”。 “CODED + VIRUS + HERE”。
所以我将正则表达式改为:
/\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"));
但是当我尝试在整个文件上应用匹配时:http://pastebin.com/ED8sFUP0页面因浏览器消息而死“在页面加载时重置了与服务器的连接。”。
我已激活错误报告:
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('scream.enabled', TRUE);
但是没有任何东西出现在这里,也没有出现在apache的错误日志中。
在不包含违规字符串的文件上使用的正则表达式按预期工作; preg_match不返回布尔值false它返回0表示没有正则表达式错误,并且没有找到任何匹配。
我的担忧不一定是正则表达式只发现部分匹配的原因。这可能是我做的一些错字,它恰好起作用了。
我想知道正则表达式编译器何时以及如何失败打破整个流程链
apache > php > regex_compiler
我明白,我的正则表达式很可能是“因为”正确编译但是没有正确匹配。它可能会导致一些不好的事情。但我感兴趣的是为什么正则表达式编译器失败而没有错误,以及我如何得到应该产生的错误消息。
类似的东西在这里讨论但未解决:php preg_match_all kills page for unknown reason
答案 0 :(得分:1)
编辑
\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*
如何处理“”。''catenation
你没有试图解析语言(你不能这样做),所以你可以
使用这个非常快速的正则表达式处理连接条件"".''
...
~
\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
答案 1 :(得分:0)
我认为你的正则表达式有很多可能匹配==> Catastrophic Backtracking
/\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\+\/]*
匹配的内容以及可选部分之后的相同内容。
您可以做的是使用possessive quantifiers(通过在其后面添加+
来使量词占有。)它们可以防止回溯,占有量词不会回馈它匹配的字符。所以,试试这个
/\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*/
^^ ^^ ^^ ^^