使用PHP和AJAX进行基于Cookie的民意调查

时间:2012-10-25 22:36:20

标签: php ajax cookies

在我的网站上,我有一个民意调查。这是基于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,所以所有更新都会通过。

有关如何解决此问题的任何建议?

2 个答案:

答案 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标头位于请求中