添加安全层以尽可能防止AJAX僵尸


Adding security layers to prevent AJAX botting as much as possible

我不确定这个标题是否是问这个问题的正确方式,但它是这样的。

案例:

我使用CodeIgniter(2.1.3)进行AJAX调用并获取JSON数据。意识到你不能真正"保护"AJAX,因为JavaScript总是可以被用户访问的,我想知道有什么可能让人们尽可能难以自动化AJAX调用。

假设你有一个游戏,你不断地请求队列数据来建造建筑和训练部队。如果我想对该网站进行机器人操作,我可以了解AJAX调用是如何工作的,并制作一个脚本将自己登录到域中,手动调用AJAX调用。

这样做的目的是;可能有10000人试图对网站进行机器人操作,我在AJAX调用中构建的障碍层可能会将这10000人减少到100人,从而使那些仍然能够跨所有层的管理员更容易跟踪。

在这种情况下,我们还可以看到他们在做什么,并尝试添加更多的检查/层,以防止大多数人能够对网站进行机器人操作。

确认实际会话

我想到的第一层是将随机哈希传递到加载的页面,并将该哈希存储在PHP会话中。通过这种方式,访问者可以"仅"从AJAX调用中获取JSON,AJAX调用获取给单个页面加载的哈希值。因此,如果他们试图在一个cURL/wget调用中使用正则表达式匹配来获取HASH,他们就不能在调用中使用它来伪造AJAX调用。

我仍然认为多页加载tho存在问题。我可能在跟踪人们是否以登录名打开了一个新页面,并给他们一条消息,他们可能无法在多个页面上操作该应用程序。此外,像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调用有关,还与网页中的每个请求有关。为了防止自动装置访问,大多数网站都使用某种captcha图像。

  1. 理念:也许您可以将触发ajax调用的图形元素放置在图像内的不同位置,这样只有人才能在正确的位置单击它们。我想到的是一幅图像,它显示了只有你知道其位置的元素。您只需通过ajax请求发送图像内的点击位置,并比较它是否是正确的位置

2.理念:在10个ajax请求过快且里面有图像后,打开一个captcha窗口,这样用户必须验证自己是人。没有验证就没有正在进行的游戏。

也许你可以在游戏中以某种方式建立验证,这样用户就不会马上把它看作是一个验证码。

Lucian