2

以前にも似たような質問をしましたが、答えは簡単でした。

JavaScript がそれを行うことができれば、どのクライアントでもそれを行うことができます。

しかし、AJAX 呼び出しを JavaScript に制限する方法を知りたいと思っています。

その理由は :

ユーザーが次のようにタグ付けされた画像をクリックすると、Webアプリケーションを構築しています。

<img src='src.jpg' data-id='42'/>

JavaScript は、次のように PHP ページを呼び出します。

$.ajax("action.php?action=click&id=42");

次に、action.php がデータベースに行を挿入します。

しかし、一部のユーザーは、必要な URL を呼び出すことによって、すべての ID などを「クリック」するエントリを自動化できるのではないかと心配しています。それらはソース コードに表示されているからです。

このようなことを防ぐにはどうすればよいですか?また、ブラウザのタブから URL を呼び出すのではなく、クリックでのみ機能するようにするにはどうすればよいですか?

ps

可能な解決策は、ユーザーの訪問時にキーを生成し、そのキーでアクションページを呼び出すなど、暗号化を使用すること、またはハッシュ/ md5sum /その他のものを使用することだと思います. しかし、それをセキュリティの問題に変えることなく実行できると思います。私は正しいですか?さらに、この種のセキュリティまたはその実装について何も知らないため、この方法が解決策であるかどうかはわかりません。

4

5 に答える 5

2

あなたの質問は、「どうすれば AJAX と非 AJAX を区別できますか?」ということではありません。それは、「誰かがクリックを繰り返したり、投票用紙を詰め込んだりして、スコアを水増しするのをどのように止めればよいでしょうか?」ということです。

あなたが尋ねた質問への答えとして、あなたが引用した答えは本質的に正しかった. 要求が AJAX、特定のブラウザー、CURL セッション、または生の HTTP コマンドを telnet セッションに入力している人によるものかどうかを判断する信頼できる方法はありません。ブラウザー、スクリプト、またはアプリが表示される場合がありますが、PHP が表示するのは次のすべてです。

GET /resource.html HTTP/1.1
host:www.example.com

リクエストが AJAX であるかどうかを知りたい便利な理由がある場合、jQuery などの一部の JavaScript ライブラリは、検索できる追加の HTTP ヘッダーを AJAX リクエストに追加するか、手動でヘッダーを追加するか、ペイロードにフィールドを含めることができます。 AJAX=1 として。次に、それらのサーバー側を確認し、AJAX 要求に対して実行する必要があると思われるアクションを実行できます。

もちろん、CURL を使用して正しいヘッダーを設定した同じ要求を作成し、サーバーに AJAX 要求であると認識させることを妨げるものは何もありません。したがって、リクエストが AJAX であるかどうかに関心がある場合にのみ、そのようなトリックを使用して、応答を適切にフォーマットできるようにする必要があります (AJAX でない場合は HTML ページを送信し、AJAX の場合は JSON を送信します)。アプリケーションのセキュリティは、そのようなトリックに依存することはできません。アプリケーションの設計で、セキュリティまたは信頼性の理由から AJAX と非 AJAX を区別する機能が必要な場合は、アプリケーションの設計を再考する必要があります。

実際に達成しようとしていることに対する答えとして、いくつかのアプローチがあります。ただし、完全に信頼できるものはありません。最初のアプローチは、最初のクリックでユーザーのマシンに Cookie を置き、その後の要求に Cookie がある場合、そのユーザー エージェントからの後続の要求を無視することです。これは非常に単純で軽量なアプローチですが、単に Cookie を削除するか、そもそも Cookie の受け入れを拒否するだけで、簡単に破ることができます。

または、ユーザーが AJAX リクエストを行ったときに、クリックが送信されたという事実とともに、リクエストしているユーザー エージェントに関する情報を記録できます。たとえば、クリックのタイムスタンプとともに、クライアントの IP とユーザー エージェント文字列のハッシュ (MD5 より強力なもので保存されます!) を保存できます。密接にグループ化されたタイムスタンプとともに、同じハッシュが多数表示される場合は、悪用が試みられている可能性があります。繰り返しますが、このトリックは 100% 信頼できるわけではありません。ユーザー エージェントはユーザー エージェント文字列として必要な任意の文字列を見ることができるからです。

于 2013-08-07T13:44:47.633 に答える
0

この解決策にはさらに熟考が必要かもしれませんが、うまくいくかもしれません

Slicedpan の回答に記載されているように、トークンを使用できます。ページを提供するとき、各画像のuuidを生成し、セッション/データベースに保存します。

次に、htmlを次のように提供します

<img src='src.jpg' data-id='42' data-uuid='uuidgenerated'/>

あなたのajaxリクエストは次のようになります

$.ajax("action.php?action=click&uuid=uuidgenerated");

次にphp側で、メモリ/データベースのuuidを確認し、トランザクションを許可するかどうかを確認します。(他の応答に記載されているように、ajax で送信されたカスタム ヘッダーを確認することもできます)

また、トークンの有効期間、ウィンドウのアンロード、セッションの有効期限が切れたときに、uuid をパージする必要があります。

この方法では、リクエストが xhr からのものかどうかを知ることはできませんが、その数を制限することはできます。

于 2013-08-07T13:33:09.910 に答える
0

get の代わりに post メソッドを使用します。jquery で post メソッドを使用する方法については、http: //api.jquery.com/jQuery.post/ のドキュメントを参照してください。

于 2013-08-07T13:19:08.590 に答える
0

たとえば、URL を呼び出すだけでなく、リクエストが本当に AJAX で行われたかどうかのチェックを実装できます。

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
    // Yay, it is ajax!
} else {
    // no AJAX, man..
}
于 2013-08-07T13:20:27.770 に答える