案件:
我正在使用CodeIgniter(2.1.3)来进行AJAX调用并获取JSON数据.意识到你不能真正“保护”AJAX,因为用户总是可以访问JavaScript,我想知道有什么可能让人们尽可能地让AJAX调用自动化.
假设你有一个游戏,你不断要求建造建筑物和训练部队的队列数据.如果我想要浏览该网站,我可以找出AJAX调用的工作原理并制作一个脚本来自己登录到域并手动调用AJAX调用.
这样做的目的是;可能有10000人尝试对网站进行操作,我将在AJAX调用中构建的阻碍层可能会将10000个减少到100个,从而更容易跟踪仍然设法跨越所有层的管理员.
在这种情况下,我们还可以看到他们正在做什么,并尝试添加更多检查/图层,以防止大多数人能够浏览网站.
确认实际会话
我想到的第一层是将随机哈希传递给加载的页面,并将该哈希存储在PHP Session中.通过这种方式,访问者可以“仅”从获取给单个页面加载的哈希值的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.';
}
}
?>
我知道这种方法有点幼稚,但我很想知道其他人如何做到这一点(客户端)以防止大多数僵尸.当然,我还要验证服务器端的所有传递数据,以确保没有数据在数据应该具有的标准之外进行自定义.
解决方法:
我认为这个问题不仅限于ajax调用,而是绑定到网页中的每个请求.
为防止自动机访问,大多数网站都使用某种验证码图像.
>想法:
也许你可以放置图形元素来触发图像内不同位置的ajax调用,这样只有人才能在正确的位置点击它们.我正在考虑一个图像,显示只有你知道位置的元素.您只需使用ajax-request发送图像内部的点击位置,并比较它是否是正确的位置…
2.Idea:
在10个ajax请求之后打开一个验证码窗口,里面的图像速度太快,这样就可以了
用户必须验证自己是人.没有验证没有正在进行的游戏.
也许你可以在游戏中以某种方式构建验证,这样用户就不会立即将其视为验证码.
卢西恩