6

この質問は、SQL インジェクション攻撃からの保護に関するものではありません。その質問は StackOverflow で何度も回答されており、私はその手法を実装しました。これは、試行を停止することです。

最近、私のサイトは膨大な数のインジェクション攻撃を受けました。現在、それらをトラップして静的ページを返しています。

私のURLは次のようになります。

/products/product.php?id=1

これは、攻撃がどのように見えるかです:

/products/product.php?id=-3000%27%20IN%20BOOLEAN%20MODE%29%20UNION%20ALL%20SELECT%2035%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C%27qopjq%27%7C%7C%27ijiJvkyBhO%27%7C%7C%27qhwnq%27%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35%2C35--%20

これが単なる悪いリンクや太い指のタイピングではないことは確かなので、概要ページに送りたくありません。また、サイトで静的ページを配信するリソースを使用したくありません。

でページを死なせることを検討していますdie()。このアプローチに問題はありますか?または、より適切な PHP で設定できる HTML リターン コードはありますか?

編集:

以下のいくつかのコメントに基づいて、「ページが見つかりません」を返す方法を調べました。icktoofay によるこのスタック オーバーフローの回答では、404 を使用してから die(); を使用することを提案しています。- ボットは、ページが存在しないと考えており、ページが見つからないというメッセージを表示するために使用されるリソースがなくなる可能性さえあります。

header("HTTP/1.0 404 Not Found");
die();
4

4 に答える 4

6

インジェクションの可能性が高い試行を除外することがmod_securityの目的です。

アプリの正当な要求を認識するように構成するには、かなりの作業が必要になる場合があります。

もう 1 つの一般的な方法は、悪意のあるクライアントを検出したときにその IP アドレスをブロックすることです。

于 2013-08-15T18:01:19.937 に答える
1

このトラフィックがサーバーに到達するのをハードウェアで阻止することができます。パケット検査を行うほとんどのデバイスが使用できます。私はこの目的のために (とりわけ) F5 を使用します。F5 には、優れた制御とカスタマイズを可能にする iRules と呼ばれる独自のスクリプト言語があります。

于 2013-08-15T18:10:40.667 に答える
-1

私からの非常に良い質問+1で、答えは簡単ではありません。

PHP は、異なるページや異なるセッションのデータを維持する方法を提供しないため、アクセスの詳細をどこかに保存しない限り、IP アドレスでアクセスを制限することはできません。

これにデータベース接続を使用したくない場合は、もちろんファイルシステムを使用できます。これを行う方法はすでにご存知だと思いますが、ここで例を確認できます。

DL's Script Archives
http://www.digi-dl.com/
(click on "HomeGrown PHP Scripts", then on "IP/networking", then
on "View Source" for the "IP Blocker with Time Limit" section)

以前は「mod_throttle」が最適なオプションでした。これを使用して、次のディレクティブを Apache 構成ファイルに追加することで、各 IP アドレスを 5 秒ごとに 1 回のアクセスに制限できます。

<IfModule mod_throttle.c>
    ThrottlePolicy Request 1 5
</IfModule>

しかし、いくつかの悪いニュースがあります。mod_throttle の作者は製品を放棄しました:

"Snert's Apache modules currently CLOSED to the public 
  until further notice. Questions as to why or requests
  for archives are ignored."

最近では、別の apache モジュールである mod_limitipconn がより頻繁に使用されています。恣意的な制限を加えることはできません (「15 秒ごとに 10 個を超えるリクエストを送信しない」など)。できることは、各 IP アドレスを特定の数の同時接続に制限することだけです。多くの Web マスターは、ボット スパムと戦うための良い方法としてそれを提唱しているようですが、mod_throttle よりも柔軟性が低いようです。

実行している Apache のバージョンに応じて、異なるバージョンの mod_limitipconn が必要です。

mod_limitipconn.c - for Apache 1.3
http://dominia.org/djao/limitipconn.html

mod_limitipconn.c - Apache 2.0 port
http://dominia.org/djao/limitipconn2.html

最後に、Apache サーバーが Linux マシンでホストされている場合、カーネルの再コンパイルを必要としない解決策があります。代わりに、「iptables」ファイアウォール ルールを使用します。この方法はかなり洗練されており、「この IP からの接続は 1 分間に 3 つまで」などの制約を課すのに十分柔軟です。方法は次のとおりです。

Linux Noob forums - SSH Rate Limit per IP
http://www.linux-noob.com/forums/index.php?showtopic=1829

これらのオプションはいずれも理想的ではないことは承知していますが、可能なことを示しています。結局、ローカル データベースを使用するのが最善なのでしょうか? いずれにせよ、単にリクエストのレートを制限したり、帯域幅を制限したりするだけでは、ボットの問題は解決しないことに注意してください。もっと時間がかかるかもしれませんが、最終的には速度を落とさない場合と同じくらい多くのリソースを消費します。HTTP リクエストを単に遅延させたり広げたりするのではなく、実際に拒否する必要があります。

コンテンツとスパムの間でエスカレートする戦いに頑張ってください!

于 2013-08-15T18:25:20.510 に答える