2012-10-25 40 views
2

在我的网站上,我有一个民意调查。这是基于cookie的民意调查。如果用户投票,我使用当前投票创建一个cookie,因此只有在创建新投票时才能进行投票。我知道用户可以删除cookie并重新投票,但这不是问题。基于Cookie的民意调查使用PHP和AJAX

我有一个处理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,所有更新都会经过。

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

+1

我能想到的是节流的唯一的事情。你在某种方式下只能在相同的几秒钟内允许每个ip的N张选票。每5秒钟一次投票。如果您还没有分开记录每个投票,并且存储IP,那么您将不得不单独记录每个投票。 –

回答

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.. 
    }); 
} 
+0

我想我明白你在暗示什么,但是我没有提交表单,我只用jQuery发布ajax文章。 – Andrej

+1

@Andrej:我添加了一个简单的伪代码示例,它可以帮助您更好地理解。 – raidenace

+0

谢谢,我会尽力实现这个! – Andrej

0

尝试重定向当你设置cookie,从而使设置Cookie标头是在请求