パワーユーザーが私のajax関数を呼び出さないようにするにはどうすればよいですか?


12

Ajax呼び出しを使用して多くの機能を実行するサイトがあります。彼らはスクリプトへのwebbrowserコールバックを持っています-ajax.php。投稿データを使用してデータを送信し、ajaxスクリプトが呼び出すことができるコマンドを制限しますが、ユーザーがサイトを操作しようとするためにajax呼び出しをスプーフィングすることを妨げるものは何もありません。ユーザーが通話をスプーフィングするのを防ぐ包括的な方法はありますか?ajax呼び出しが実際に他のスクリプトやサイトからではなく、私のWebサイトから来ることを保証する方法はありますか?

または、PHPスクリプトで境界条件を確認し、ユーザーが許可されていないことをスプーフィングするのを防ぎ、許可されている場所をスプーフィングすることを許可する必要があります。


ajax呼び出しは完全に認証されていませんか?それぞれのセッションを作成しますか?虐待のパターンはありますか?また、問題固有の操作は、サイトに追加する負荷の量以上ですか?
artlung

詳細を投稿してください。AJAX呼び出しは何をしていますか?彼らは何を操作していますか?スクリプトがAJAXの外部で呼び出された場合、どのような問題が発生しますか?
不機嫌なヤギ

私は実際に特定の状況について尋ねているのではなく、多くの状況に適用可能な一般的な解決策を求めています。そのような解決策がある場合、それはあるようには見えません。
ダニエルビンガム

回答:


12

送信する可能性のある情報は、ユーザーの巧妙さに応じてなりすましされる可能性があるため、これを確実に行う方法はないと思います。

あなたのページからではない人の単純なブロックが必要な場合は、リファラーを確認するか、Cookieを使用するか、一定時間後に期限切れになる呼び出しページから送信されるランダムな非表示フィールドを追加します。しかし、ユーザーが本当に決心している場合、これらは簡単になりすますことができます。


2
+1 ..ブラウザーが表示するもののローカルコピーを保存しないようにすることは不可能であるように。彼らがそれを理解する前にあなたが彼らをあきらめて、他の何かに進むことができるかどうかを見るためのそれはより多くのコンテストです。
ティムポスト

6

要するに、いいえ。GETまたはPOSTを介してURLに行われた要求は、任意のソフトウェアを使用する誰でも行うことができます。実際、AJAXリクエストはURLを直接ロードすることと実際に違いはありませんが、後者では、返されたデータがWebページのようにブラウザに表示されます。

これがまさに、JavaScript検証を行うかどうかにかかわらず、サーバー上で送信されたデータを常に検証する必要がある理由です。

サーバー側のスクリプトが何をしていて何がうまくいかないかは明確ではありませんが、ユーザーが不正なデータでスクリプトを呼び出すことで「サイトを操作する」ことができる場合、それは間違っています。

おそらく最良の解決策は、何らかの形式の認証を導入することです。


3

それで、基本的にajax.phpをAJAXリクエストにのみ応答するように制限したいですか?

私はphpのエキスパートではありませんが、の値をチェックすることで、特定のリクエストがAJAXからのものか「通常の」ブラウザリクエストからのものかを判断できるようです$_SERVER['HTTP_X_REQUESTED_WITH']

ソース


2
HTTPヘッダこと乱用者はAJAXまたは鍛造を使用していないと仮定すると良い点、
アダム

1

他の誰かが指摘したように... ajax呼び出しは単なる$ _GETまたは$ _POSTの受信者であるため、私のアプローチは常にアクションページと同じように扱い、入力をフィルタリング/サニタイズすることでした。たとえば、月のように期待するもののわずかなバリエーションがあり、それが常に「1月、2月、3月...」形式であることがわかっている場合は、期待値の配列を設定し、それに対してフィルタリングできます。一致しないものはすべてトラップし、オプションで「Bzzt ... thanks for playing ...」のようなものをスローします。

私のAjaxスクリプトがフォーム送信よりも安全である必要がある例は考えられません。

HTH


「Bzzt」の+1-「Bzzt-プレイしてくれてありがとう!」のコンテキストでは、これほどおもしろくなります。その後、ユーザーのマシンに設定されたCookieによって強制される3時間の禁止に伴い、ゆっくりと黒にフェードします(メッセージが表示されると確信しています)
danlefree

0

ソリューションの主な部分は、特定のユーザーフィンガープリントからのトラフィックをレート制限することです。たぶん、IPアドレスのハッシュ、ユーザーエージェント文字列、および送信されるデータ。

また、ajaxを呼び出すページをajaxが返すデータに密接にバインドすることも役立ちます。そのため、問題のページでは、ページの読み込み時にXセッションに適したセッションキーを送信します。各ajaxリクエストに対して、JavaScriptはそのキーを返す必要があります。そうしないと、ajaxはエラーを返します。ページがX+1ajaxコールにヒットしたら、ユーザーに新しいセッションキーを送信する前に(元のajaxの帯域外で)何らかのアクション(UAに応じたイベントmousemovetapイベントなど)を強制してから再起動しますプロセス。

私が考えているように、おそらくあなたの問題の一部は送信されたパラメータの緩い検証である可能性があります。送信されたパラメータを使用して有効なデータを取得するだけで済む場合は、その作業を難しくします。その方法は、クライアントが送信する値の種類と、悪い値を送信することで悪役がどのような悪戯をするかによって異なります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.