【问题标题】:Prevent fake looping ajax requests to PHP防止对 PHP 的虚假循环 ajax 请求
【发布时间】:2015-06-02 12:30:08
【问题描述】:

在我的网站上,我为博客文章创建了一个评论部分。用户可以编写 cmets,单击一个按钮,一个 AJAX 请求将被发送到 PHP,其中包含 JSON 格式的数据。 PHP 将处理和验证数据,然后将其插入数据库。成功后,将从数据库中检索所有 cmets,并使用 JQuery 重新加载页面的所有 cmets。

问题是任何人都可以使用浏览器控制台伪造 AJAX 请求,填写自己的 JSON,然后将请求发送到 PHP。如果这样做,所发生的一切都是我的客户端验证是无用的。服务器端验证仍然有效。但是,还有一个更大的问题。

for(var i = 0; i < 10000; i++) {
    //ajax request
}

用户可以非常轻松地立即将成千上万条记录插入我的数据库。

有人对我如何防止此类事情发生有任何建议吗?它必须涉及在服务器端创建用户无法猜到的东西,并在 AJAX 请求期间以某种方式对其进行检查。我只是不确定该怎么做。

感谢您的帮助。

【问题讨论】:

  • 有人可以通过简单地查看发送 ajax 请求的地址并用任何语言(如 shell 脚本和 curl)编写脚本来发送带有数据的连续请求来做同样的事情。谷歌“对 php 的速率限制”。

标签: javascript php jquery ajax json


【解决方案1】:

在这方面确保您安全的唯一方法是添加验证码。

这将阻止群发/自动发帖。一个可能使用的库是 Securimage 。它易于使用和集成。你可以用你的 AJAX 东西在 10 分钟内运行它。

如果可能的话,依赖其他方式(例如 cookie 或某种客户端验证)是有风险的。例如,KA_lin 的解决方案可以在 5 分钟内被攻破:恶意用户可以发送伪造的 cookie,其页面计数始终为 0,因此将始终被允许发布。或者更糟的是,他可以创建一个小程序,在不发送任何 cookie 的情况下发布到您的页面。上面的代码每次都会创建一个新的cookie并接受他的帖子......

【讨论】:

    【解决方案2】:

    我会添加一个会话变量,其中包含用户发布的帖子数量,给定许多页面,您可以形成类似 $SESSION['page_id_total_nr_comments'] 的内容并跟踪这个数字,添加一个配置变量,让我们使用最多添加 X例如每篇文章的 cmets:

      function canUserAddComment($pageId){
        $maxAllowed =......;
        if(!isset($SESSION[$pageId+'_nr_comments'])){
            $SESSION[$pageId+'_nr_comments'] = 0;
        }
        if($SESSION[$pageId+'_nr_comments']< $maxAllowed){
            $SESSION[$pageId+'_nr_comments']++;
            return true;
        }
        return false;
      }
    

    保存时获取文章中已使用的 cmets 数量,并决定是否可以创建另一个(仍然使用配置变量)

    【讨论】:

      猜你喜欢
      • 2017-11-23
      • 1970-01-01
      • 1970-01-01
      • 2011-11-06
      • 1970-01-01
      • 1970-01-01
      • 2021-01-29
      • 2016-10-15
      • 1970-01-01
      相关资源
      最近更新 更多