在我的网站上,我有一个民意调查。这是基于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,所以所有更新都会通过。
有关如何解决此问题的任何建议?
答案 0 :(得分: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..
});
}
答案 1 :(得分:0)
设置cookie时尝试重定向,以便Set-Cookie标头位于请求中