3

私のサイトには、ページをリロードして簡単な通知を行わずにカートにアイテムを追加するAJAXリクエストを行うJavascriptメソッドがあります。

 AddToCart()

ただし、任意のJavascriptコンソールを使用すると、次の簡単なステートメントでこのリクエストをフラッディングできることがわかりました。

while (true) {AddToCart()}

そして最終的にはブラウザがクラッシュするまでサーバーをロックします。より安定したブラウジング環境は、おそらくサーバーを無期限にロックする可能性さえあります。では、そのような試みから保護するための最良の方法は何でしょうか?

4

6 に答える 6

6

おそらく、プライベート名前空間で関数を定義する必要がありますか?

(function() {
   function AddtoCart(){};
})();

そうすれば、コンソールから参照できなくなります。

もちろん、誰でもコードを複製したり、URI に対して HTTP リクエストを作成したりすることができるため、これは防弾ではありません。

HTTP リクエストを停止することはできませんが、おそらく CSRF トークンを実装することでページの処理データを停止できるため、変数に基づいて CSRF を作成するページから生成される CSRF トークンが一致しない限り、重い処理を行うことはありません。タイムスタンプなどのように、(簡単に?) 再現することはできません。

于 2011-09-21T18:42:04.877 に答える
4

ab同時実行性の値が高い(Apacheベンチマーク)を使用すると、はるかに多くのダメージを与えることができます。または、F5を打つだけでそこに座ることができます。低レベルのソリューションが必要です。レート制限、おそらくIPによるもの、1回限りのハッシュ、またはその他のソリューションが必要です。

于 2011-09-21T18:45:08.757 に答える
4

サーバーが不正なクライアントから身を守る方法はたくさんあります。この特定のケースでは、サーバーが、人間が操作するのが妥当であると考えるクライアントからの 1 分あたりの操作の最大数をサーバーが選択する場合、および 1 つのクライアントからの操作の速度がそれ自体を保護する速度を超える場合に、おそらく「レート制限」が適切です。 . 自分自身を保護するためにどのように選択するかは、状況によって異なります。多くのサーバー リソースを使用しないようにするために、しばらくの間新しい要求が発生するたびにすぐに失敗したり、クライアントをログアウトしたり、サイレントに失敗したり、エラーを返したりする可能性があります。

ajax 呼び出しは、自分のクライアント コードだけでなく、誰でも実行できるため、サーバーは、この種のことに対する実際の保護をサーバーで行う必要があることを認識しておく必要があります。

クライアントでは、さまざまな方法で不正な JavaScript が注入されるのを防ぐことができます。コードの下部で、レート制限を実装して (実際の ajax 呼び出しを行う直前など)、1 分間に X 回を超える ajax 呼び出しの実行を拒否することもできます。これはサーバーを完全に保護するわけではありませんが、独自の AddToCart() 関数がこのように使用されることから保護します。

または、この方法で呼び出すことができるパラメーターを必要としない最上位のグローバル名前空間関数がないようにすることもできます。これを行うには、関連する機能をグローバル名前空間から削除する (適切な「this」ポインターを必要とするオブジェクトの 1 つのメソッドにする) か、常にそうであるとは限らない関連する内部状態を関数に要求させることができます。知られています。

個人的には、大混乱を引き起こす以外に行われている正当な目的がない場合に、所有者がクライアントに与える可能性のある虐待からクライアントを保護する必要があるとは思いません。ユーザーが自分のクライアントをクラッシュさせる悪いことをしたい場合は、それで問題ありません。必要に応じて、タスク マネージャーを使用してクライアントをダウンさせることができます。サーバーに悪いものを吹き付けないように保護し、正当な通常のユーザー操作で発生する可能性のある何か悪いことから保護したいのですが、ユーザーが自分のクライアントを停止したい場合は、睡眠を失うことはありませんそれ。

于 2011-09-21T18:42:43.327 に答える
2

リクエストは、AJAX であろうとなかろうと、リクエストです。通常の DOS 攻撃にも同じルールが適用されます。AJAX がなくても、人々があなたの URL を直接呼び出すのを止めるものは何もありません。

于 2011-09-21T18:42:17.150 に答える
1

あなたのコードを理解し、ブラウザのコンソールを開き、タイプするのに十分賢い人while (true) {AddToCart()}はブラウザ(またはあなたのコード)さえ必要としません-彼らはwget無限ループで実行することができます、または目標が本当にDoSである場合は、スクリプトを使用してくださいその目的のために。

サーバー側では、サービス拒否攻撃を軽減する方法を扱っています。多くの戦略があります; Nginxリバースプロキシを使用することが私の頭に浮かんだ最初のことです。

于 2011-09-21T18:56:55.300 に答える
0

できることの 1 つは、AddToCart関数がまだ進行中でない場合にのみ要求を実行するようにすることです。

あなたができるもう1つの考えは、コードを難読化することです(これを行うためのツールがあり、javascript難読化を検索します)。そのため、どのメソッドが何をするかは明らかではありません。

これら 2 つの方法は役に立ちますが、問題を完全に解決することはできません。サーバーは、あるクライアントからのリクエストでスパムされているかどうかを実際に検出し、レート リミッターを介してそれらを制限する必要があります。

于 2011-09-21T18:43:16.310 に答える