web-dev-qa-db-ja.com

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

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

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

12
Daniel Bingham

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

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

12
delete

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

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

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

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

6
DisgruntledGoat

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

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

ソース

3
theycallmemorty

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

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

HTH

1
digit1001

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

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

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

0
artlung