![消除多个 php 文件中的模式的最佳方法是什么?](https://linux22.com/image/138119/%E6%B6%88%E9%99%A4%E5%A4%9A%E4%B8%AA%20php%20%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E6%A8%A1%E5%BC%8F%E7%9A%84%E6%9C%80%E4%BD%B3%E6%96%B9%E6%B3%95%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F%20.png)
在受感染的网站上使用数百个 php 文件,并在每个文件的顶部注入以下签名代码:
<?php /*457563643457563643*/ ?><?php /*5467543654675436*/ ?><?php /*6745833567458335*/ ?><?php /*87934538793453*/ ?>
接下来是<?php
具有合法 php 代码的相邻部分。换句话说,注入的代码不在单独的行上。
我编写了以下代码来摆脱注入的代码:
grep -Rl 457563643457563643 . | xargs sed -i 's/<[?]php.*457563643457563643.*[?]>/<\?php \/\/ RECOVERED FILE \?>/g'
效果很好,但不幸的是它也会删除注入代码后面的合法 php 标签。
完全删除每个文件顶部注入的以下部分的最佳方法是什么:
<?php /*457563643457563643*/ ?><?php /*5467543654675436*/ ?><?php /*6745833567458335*/ ?><?php /*87934538793453*/ ?>
答案1
这最好的方法是转到入侵之前的备份之一并从那里开始。听起来你想要一种非最好的方法。您可以使用 sed 来做到这一点。
使用 sed,删除单行上的精确文本块的最直接方法就是使用命令s
显式删除它:
sed -e 's!<?php /\*457563643457563643\*/ ?><?php /\*5467543654675436\*/ ?><?php /\*6745833567458335\*/ ?><?php /\*87934538793453\*/ ?>!!'
*
这只是用任何内容替换您引用的确切字符串 -每次都需要转义元字符,但否则这将直接s!pattern!replacement!
以通常的方式使用。
我会使用find -exec
(更好的,-execdir
如果你得到了)而不是管道xargs
,尤其如果我有一个我无法信任的目录树。文件名中可能包含各种内容,特别是换行符,这可能会导致执行您不喜欢的命令。对于这个特定的sed
命令行,它不太可能是一个实际问题,但我不会将其排除在外。
您可以运行命令grep
内部find
,并且仅在文件匹配时才对文件进行操作,或者只是让其sed
处理它 - 如果模式不匹配,则文件随后将是相同的。
无论如何,我仍然建议谨慎——这些标记并不是事物的有害部分,而且这些部分可能不那么明显。
也可以看看:如何处理受感染的服务器?