2

在我的网站上,我有一个民意调查。这是基于 cookie 的民意调查。如果用户投票,我会使用当前投票创建一个 cookie,因此在创建新投票之前他无法投票。我知道用户可以删除 cookie 并再次投票,但这不是这里的问题。

我有一个处理 ajax 帖子的 ajax.php 页面。这是代码:

if(isset($_COOKIE['poll_id']) && $_COOKIE['poll_id'] == $poll_id)
{
// print message that it is already voted, show the results...
}
else
{
// update the database and create a cookie
}

如果在按钮单击时进行投票,则此代码可以正常工作。但是,我在 Firebug 中启动了一个 javascript,它正在这样做:

for(var i=0;i<100;i++) {
    jQuery.post('ajax.php', {
        //post parameters
    });
}

我得到100票。如果我再次运行脚本,它会失败,因为创建了一个cookie,但似乎如果我同时发出100个请求,检查失败,因为我猜系统没有时间及时创建cookie,所以所有的更新都会通过。

关于如何解决这个问题的任何建议?

4

2 回答 2

2

这就是XSRF玩的地方。在您的站点中,您应该首先创建一个随机(适当加盐且足够安全)字符串并将其存储在会话中。在您的所有页面中,您应该获取此会话值并将其与表单提交一起传递。在检查用户输入时,您应该将此值作为页面请求的一部分进行检查。

现在,如果您在投票页面中发送此内容,并且在 ajax.php 中检查此内容,那么您将找到该值并知道这是一个安全请求。当有人尝试通过 firebug/jquery 等进行智能操作时,他们将无法访问/发送此值,并且您的页面可以忽略此类请求。

当然,为了更好/更容易理解,我的解释过于简单化了。但是请阅读更多关于它的内容,这将有助于解决您的场景并使您的代码更加健壮。

添加一个简单的伪代码示例:

首先假设您的随机 XSRF 字符串已在会话中设置。

jQuery.post('ajax.php', {
     <?php echo $_SESSION['token'];?>,
    //rest of the post parameters
});

现在当有人用萤火虫尝试它时:

for(var i=0;i<100;i++) {
    jQuery.post('ajax.php', {
        //post parameters
        //cannot access $_SESSION['token'] so cannot pass it..
    });
}
于 2012-10-25T22:48:18.717 回答
0

设置 cookie 时尝试重定向,以便 Set-Cookie 标头在请求中

于 2012-10-25T22:42:17.600 回答