我不确定标题是否是提出这个问题的正确方法,但它就是这样。
案子:
我正在使用 CodeIgniter (2.1.3) 进行 AJAX 调用并获取 JSON 数据。意识到您不能真正“保护” AJAX,因为用户始终可以访问 JavaScript,我想知道有什么可能使人们尽可能难以自动化 AJAX 调用。
假设你有一个游戏,你不断地请求队列数据来建造建筑物和训练部队。如果我想 bot 那个网站,我可以找出 AJAX 调用是如何工作的,并制作一个脚本来将自己登录到域并手动调用 AJAX 调用。
这样做的目标是;如果有 10000 人尝试对网站进行爬虫,我将在 AJAX 调用中构建的障碍层可能会将这 10000 人减少到可能 100 人,从而使仍然设法跨越所有层的管理员更容易跟踪。
在这种情况下,我们还可以看到他们在做什么,并尝试添加更多检查/层,以防止大多数人能够对网站进行 bot 操作。
确认实际会话
我想到的第一层是将随机哈希传递给加载的页面并将该哈希也存储在 PHP 会话中。通过这种方式,访问者可以“仅”从 AJAX 调用中获取 JSON,这些调用获取为单个页面加载提供的哈希值。因此,如果他们尝试在一个 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.';
}
}
?>
我知道这种方法有点幼稚,但我想知道其他人如何做到这一点(客户端)以防止大多数botters。当然,我还在服务器端验证所有传递的数据,以确保没有超出数据应具有的标准定制数据。