ここで私の質問を試すことは、stackoverflowで提案されました。これは逐語的です:
したがって、SSLを使用せずにAJAXリクエストを安全に行うことは不可能です。わかった。 JavaScriptを介して送信されているデータを表示するか、ヘッダーを偽装してPHPページに直接アクセスできます。
しかし、このWebアプリは特にtrueセキュリティを必要とせず、ほとんどのリバースエンジニアを寄せ付けないゲームのようなものだとしましょう。どのようなハードルを採用すべきですか?
私は、暗号化アルゴリズムのばかげてオーバーザトップのJavascript実装を探していません。私はシンプルさと穏やかなセキュリティが欲しい...それが本質的に矛盾していないなら。それで、皆さんは何をお勧めしますか?
たとえば、ユーザーが画像をクリック(jQuery)すると、ユーザーIDとタイムスタンプがPHPページに渡されるコンテストを実行しています。両方ともMD5がランダムデータでソルトされ、MIMEでエンコードされています。 。 PHPページは、このユーザーIDとタイムスタンプを検証し、別のソルト付きMD5ハッシュの形で優勝した「コード」を返します。また、リクエストが有効な場所からのものであることを確認するために、複数のヘッダーチェックを採用しています。何か不足していますか、それとも私ができることはすべてですか?誰かがjQueryクリックイベントを発生させて全体を台無しにする可能性があるようですが、それを防ぐ方法はわかりません。
独創的な偽セキュリティメカニズムを思いついた人には、その答えを与えます。または...今回はなぜ私が愚かであるかを私に言う人だけ。
具体的には、何に対して安全を確保しようとしていますか?
盗聴者がクライアントとホストの間でメッセージを記録または傍受していますか?自分で暗号化プロトコル(ページのブラウザー拡張機能やJavaScriptなど)を作成したり盗聴したりできないようにするためには、基本的にSSLが必要ですが、独自の暗号化方法(遅い/弱い、複数の暗号化の専門家による調査を受けていない場合、ほぼ間違いなく重大な欠陥があります)。ユーザーが互いに別のネットワーク(およびホストマシン)にコンピューターしか持っておらず、中間ネットワークを制御していない(たとえば、ISPの1つで作業している)場合、ユーザーは盗聴できなくなります。
あなたのゲームのポイントが何であるかわかりません:
たとえば、ユーザーが画像をクリックした場合(jQuery)、ユーザーIDとタイムスタンプをPHP=ページに渡します。両方ともMD5がランダムデータでソルトされ、次にMIMEでエンコードされています。PHP=ページは、このユーザーIDとタイムスタンプを検証し、別のソルト付きMD5ハッシュの形式で勝利の「コード」を返します。複数のヘッダーチェックを使用して、リクエストは有効な場所からのものです。何か不足しているのですか、それとも私ができることはすべてですか?誰かがjQueryクリックイベントを発生させて全体を台無しにする可能性があるようですが、それを防ぐ方法はわかりません。
複数の画像があり、正しい画像は1つだけで、推測は1回しか許可されていませんか?何らかのサーバー発行トークンを使用することをお勧めします。
正しいプロセスは、(a)秘密の資格情報(ユーザー名、パスワード)を使用して、サーバーから1回限りの推測トークン(一意のランダム文字列)を要求することです。次に、画像をクリックして推測を行い、ユーザー名、トークンの推測、選択した画像を送信します。送信された推測トークンが有効で、以前に使用されたことがない場合、サーバーは画像を記録します。それ以外の場合は、トークンが無効であると表示され、回答が破棄されます。これでも、盗聴者が正しい答えを見つけ出します。
これは、クライアントがJavascriptを改ざんして起動するという問題のように思われますが、SSLでは防止できません。
誰かがjQueryクリックイベントを発生させて全体を台無しにする可能性があるようですが、それを防ぐ方法はわかりません。
これはかなり正確です。クライアント側のスクリプト、特にJavaScriptは、イベントのトリガーなどに対してロックすることが不可能です。
PHPページは、このユーザーIDとタイムスタンプを検証します
タイムスタンプの細かさ、および隣接しているかどうかを確認するためにハッシュする前方/後方の距離に応じて、レイテンシ/クロックの違い(JavascriptがローカルPCからプルされるため)によるバグを予測します一致します。
さらに、誰かにアルゴリズムreallyを決定すると、MD5がひどいためにハッシュの衝突を探します(実装を正しく理解していて、ハッシュを渡すだけの場合)。
ただし、暗号化に何を使用しても、それはクライアント側のスクリプトであるため、サーバーにデータをポストしたり、簡単にリバースエンジニアリングしたりするために使用するメソッドを起動できます。
ゲームは「クイズのような」動作を提供しているようです。ユーザーがクリックできる場所はたくさんあり、そのうちの1つだけが正しい場所です。サーバーはどちらが正しいかを認識しており、ゲームプレイヤーのパズルはどれをクリックするかを理解することです。そうですか?
あなたが現在行っていることは、クイズ(クリックする正しい場所の場所)にソリューションをクライアントに送信し、クライアントでJavascriptを使用して各クリックをチェックして、それが正しいかどうかを確認しているようです。正しいと思われる場合は、他の問題を抱えてサーバーに送信します。もちろん、これは本質的に安全ではありません。ユーザーが悪意のある場合、ユーザーはJavascript(またはJavascript実行環境)を改ざんし、内部を覗いて、クリックする正しい場所を見つけて、クイズに勝つことができるためです。
これを行う安全な方法は、サーバーですべてのソリューションチェックを行うことです。正しい解決策をクライアントに送信しないでください。ユーザーが場所をクリックしたとき、AJAXクエリを介してサーバーに場所を送信します。ユーザーのクリックが正しいかどうかをサーバーコードに確認させ、これを追跡して返信しますそうすれば、ユーザーがクライアント側のJavascriptコードをいじったりしても、正しい解決策を見ることができず、クイズを解く上で何のメリットもありません。
一般的な経験則は次のとおりです。サーバーを制御できるため、サーバー側のアプリケーションを正しくコーディングすれば、信頼できます。ただし、クライアントを制御することはできません(ブラウザーはユーザーの制御下にあり、ユーザーの制御下にあります)。そのため、クライアントまたはクライアント側のコードを信頼できません。クライアントを信頼しないでください。セキュリティチェックをサーバーに置いてください。
次の本はAjaxセキュリティに優れています Ajax Security 、見てください