使用perl从一堆php文件中删除的强硬字符串

时间:2012-03-15 21:25:23

标签: regex perl replace

我越来越秃顶,因为我把头发弄出来应该是一件简单的事情。我在一些PHP文件(100s)中留下了一个黑客攻击的片段。

字符串是:

<?*god_mode_on*/eval(base64_decode("")); /*god_mode_off*/ ?>

我认为使用perl命令行如:

perl -pn -i.bak -e "s{<\?\*god_mode_on\*/eval\(base64_decode\(""\)\); /\*god_mode_off\*/ \?>}{}g;" `find . -name '*.php'`

整齐地生成备份并删除字符串,但似乎小心避免这样做。我想我现在可能已经失明了,因为我已经看了很长时间,所以希望有人可以直接看到问题,让我知道我有多慢; - )

谢谢!

2 个答案:

答案 0 :(得分:1)

跟踪需要转义的所有内容并不简单。例如,看起来您没有在双引号字符串中转义双引号。 Perl具有quotemeta功能,可以帮助您解决这个问题:

print quotemeta '<?*god_mode_on*/eval(base64_decode("")); /*god_mode_off*/ ?>';

===>  \<\?\*god_mode_on\*\/eval\(base64_decode\(\"\"\)\)\;\ \/\*god_mode_off\*\/\ \?\>

在正则表达式中,\Q转义符将在下一个quotemeta转义的所有内容上调用\E,因此您可以说:

perl -p -i.bak -e \
  's{\Q<?*god_mode_on*/eval(base64_decode("")); /*god_mode_off*/ ?>\E}{}g' \
  `find . -name '*.php'`

请注意,我使用单引号而不是双引号作为-e命令行开关的参数。否则,您还必须担心shell插入输入并打开另外一堆蠕虫。

(另外,-pn开关是多余的 - 只需使用-p

答案 1 :(得分:0)

你使用的shell是否有可能解释反斜杠?您可能需要转义它们(使用另一个反斜杠),因此它们实际上会以反斜杠的形式传递给perl。