web-dev-qa-db-ja.com

サイト生成リクエストを除くhtaccess 410 URLスパムハックリクエスト

私たちのサイトがハッキングされ、サイトに追加されたランダムなコンテンツへのリンク。ハッキングされたサイトを完全に削除し、新しいサイトを代わりに置きました。画像やコンテンツを含む新しいものすべて、古いサイトの他の部分は使用されていません。

現在の問題は、ハッカーが検索ボットに100,000のリンクを送信し、ボットが1秒ごとに継続的にアクセスし、存在しないリンクと古いリンクには存在しないリンクをインデックス付けしようとしていることです。新しいサイト。

サイトのhtaccessファイルを使用してさまざまな条件のいくつかのインスタンスを使用してこれに対処し、ボットにコンテンツがなくなったことを伝えるルールを書き直しました。

RewriteCond %{REQUEST_URI} .*/product/.*
RewriteRule ^ - [R=410,L]

これに伴う問題は、一部の要求が通過して、301および404エラーを生成することです。

これにより、ボットはリクエストを再テストし、サイトに100,000の不良リンクがあると報告します。

サイトの実際の一部であるすべてのソースリクエストを除くすべてのリクエストに対して、410コードをボットに返すソリューションを探しています。

このサイトには約10ページしかありませんが、Joomla CMSであるため、ページを配信するためにバックグラウンドでロードされる大量のリソースがあります。

私のアイデアは、サイト内の各ページにアクセスし、ブラウザーの検査を使用して、ページが行うすべてのリソース要求のリストを収集することでした。

問題は、これをhtaccessの条件とルールにどのように定式化して、ルート/を含むすべてのページ要求が配信されるが、ボットが要求するハッカーリンクが配信されないようにするかです。

また、ボットのリクエストがハッカーによって扇動されていると言うために、ボットにメールを送信する作業を行っています。

2
744

基本的に、404ではなく410を送信します。

おそらく最も簡単な方法(Joomlaに精通している場合)は、テンプレートのerror.phpファイルをオーバーライドし、404が既に決定されている場合に手動で410ステータスを設定することです。たとえば、error.phpファイルの先頭にある次のようなもの:

if ($this->error->getCode() == '404'){
    header("HTTP/1.0 410 Gone");
}

あるいは、約10ページしかないため、ページURLのホワイトリストを作成して.htaccessでこれを実行し、リクエストされたURLがホワイトリストと一致せず、物理ファイル。これにより、Joomlaによるリクエストの速度低下も回避できます(長所と短所-終わりを参照)。

例えば:

# Whitelist of page URLs 
# NB: Last condition must not have an OR flag
RewriteCond %{REQUEST_URI} =/second-page [OR]
RewriteCond %{REQUEST_URI} =/third-page [OR]
RewriteCond %{REQUEST_URI} =/fourth-page [OR]
RewriteCond %{REQUEST_URI} =/fifth-page [OR]
RewriteCond %{REQUEST_URI} ^/admin/
RewriteRule . - [E=PAGE_URL:yes]

# Send 410 Gone
RewriteCond %{REQUEST_URI} !\.(css|js|png|jpg|gif|svg|pdf)$ [NC]
RewriteCond %{ENV:PAGE_URL} !yes
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !^(index\.php)?$ - [G]

これは、ホームページ(つまり/)が有効なページURLであることを前提としています。 Ggone)フラグはR=410の省略形であり、Lフラグは必要ありません(暗黙のうちに)。

最初のRewriteCondディレクティブは、静的リソース(ファイル拡張子で示される)のように見えるURLが存在しない場合、410の提供から除外します。デフォルトの404を取得する必要があります。静的リソースの。たとえば、ナンセンス.cssファイルに対するスパムのような要求を受け取っている場合は、RewriteCondディレクティブからその拡張子を削除するか、条件を完全に削除して、これらすべての欠落リソースに対して410を提供します。

CondPattern=プレフィックス=/second-pageは、正規表現ではなく完全一致文字列の比較を行うため、正規表現のメタ文字などをエスケープする必要はありません。

ただし、これにより、ユーザーにとって使いやすい「Joomla 404ページ」が失われるため、作成する必要がある場合があります。


更新:

一部のスパムURLには、このタイプの構造/?anything=があります

クエリ文字列を含むURLをブロックする場合は、QUERY_STRINGサーバー変数に対してチェックする条件が必要です。以下を追加してみてください。

# Block any URL that contains a query string on unknown pages
RewriteCond %{QUERY_STRING} .
RewriteCond %{ENV:PAGE_URL} !yes
RewriteRule ^ - [G]

単一のドット正規表現(単一の文字に一致する)は、クエリ文字列が存在することを確認するだけです。

2
MrWhite