【发布时间】:2012-05-17 16:50:40
【问题描述】:
我正在使用 preg_match 在文件中查找和删除经过评估的 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"));
但是当我尝试在整个文件上应用匹配时: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
我知道这很可能是“因为”我的正则表达式恰好编译正确但不正确匹配。它可能会导致一些不好的事情发生。但我的兴趣是为什么 regex 编译器失败且没有错误,以及我如何获得应该产生的错误消息。
此处讨论了类似但未解决的问题:php preg_match_all kills page for unknown reason
【问题讨论】:
-
我answered the question you linked。我认为您有类似的问题,但我仍然尝试理解您的正则表达式。
标签: php regex preg-match pcre