タイトルがこの質問をする正しい方法かどうかはわかりませんが、ここに行きます。
場合:
CodeIgniter (2.1.3) を使用して AJAX 呼び出しを行い、JSON データを取得しています。JavaScript は常にユーザーがアクセスできるため、AJAX を実際に「保護」することはできないことに注意して、人々が AJAX 呼び出しを自動化するのをできるだけ難しくする可能性は何かと考えていました。
建物を建設し、部隊を訓練するためのキュー データを要求し続けるゲームがあるとします。その Web サイトをボットにしたい場合は、AJAX 呼び出しがどのように機能するかを調べて、自分自身をドメインにログインさせ、AJAX 呼び出しを手動で呼び出すスクリプトを作成するだけで済みます。
これを行う目的は次のとおりです。10000 人が Web サイトをボットしようとするかもしれませんが、AJAX 呼び出しに組み込む妨害層によって、それらの 10000 人がおそらく 100 人に減り、すべての層を通過できた管理者を追跡しやすくなります。
この場合、彼らが何をしているのかを確認し、チェック/レイヤーを追加して、大多数が Web サイトをボット化できないようにすることもできます。
実際のセッションの確認
私が考えていた最初のレイヤーは、読み込まれたページにランダムなハッシュを渡し、そのハッシュを PHP セッションにも保存することです。このようにして、訪問者は、その単一ページの読み込みに与えられたハッシュ値を取得する AJAX 呼び出しから JSON を「のみ」取得できます。そのため、1 回の cURL/wget 呼び出しで正規表現一致を使用して HASH をフェッチしようとしても、その呼び出しでそれを使用して AJAX 呼び出しを偽装することはできません。
ここには、複数のページの読み込みに関する問題がまだあると思います。ユーザーがログイン名で新しいページを開いているかどうかを追跡し、アプリケーションを操作するために複数のページを操作することはできないというメッセージを伝えている可能性があります。また、Selenium などの自動化ツールでも問題が発生する可能性があります。
CodeIgniter では、次のようにします。
<?php
public function index()
{
$this->load->helper(array('security', 'url'));
$this->load->library('session');
$data = array();
// AJAX Security
$data['hash'] = sha1(hash('md5', (microtime() - rand(0, 1^3)) * rand(0, 1^12)));
$this->session->set_userdata('live_hash', $data['hash']);
$this->load->view('jqueryjson', $data);
}
public function xhr()
{
$json_data = json_decode($data_set);
if (isset($data_set['hash']) AND $data_set['hash'] == $this->session->userdata('hash')) {
echo 'HASH security layer passed<br />';
echo json_encode(array('JSONDATA TO BE SEND BACK'));
}
else {
echo 'Please do not call the page outside a browser.';
}
}
?>
私はこのアプローチがちょっとナイーブであることを知っていますが、ボットの大部分を防ぐために他の人がこれをどのように (クライアント側で) 行うのか疑問に思っています。もちろん、サーバー側で渡されたすべてのデータを検証して、データが持つべき標準外でデータがカスタマイズされていないことを確認しています。