php - 使用 PHP 和 AJAX 基于 Cookie 的民意调查

标签 php ajax cookies

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

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

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,这样所有的更新都会通过。

关于如何解决这个问题有什么建议吗?

最佳答案

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

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

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

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

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

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

现在,当有人尝试使用 firebug 时:

for(var i=0;i<100;i++) {
    jQuery.post('ajax.php', {
        //post parameters
        //cannot access $_SESSION['token'] so cannot pass it..
    });
}

关于php - 使用 PHP 和 AJAX 基于 Cookie 的民意调查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13078379/

相关文章:

php - 在 AJAX 查询后使用 jQuery 解释 PDO 错误

javascript - ajax 按键功能不起作用,ActionResult 参数未收到任何值

javascript - 使用 promises 获取 ajax 数据

javascript - 未使用 javascript 设置 Samesite cookie 属性

javascript - 在 Play 中使用 cookie 刷新页面

php - 在继承的 php 类中使用常量

php - Laravel 中的项目从 5.8 更新到 6 时出现问题

php - SQLSTATE[42000] : Syntax error or access violation

php - 只是 html/js 还是与服务器端代码混合?

javascript - Selenium 。 HtmlUnitDriver。如何启用 JavaScript 和 Cookie?