【问题标题】:Preventing spammy XMLHTTP requests to php防止向 php 发送垃圾邮件 XMLHTTP 请求
【发布时间】:2015-06-17 06:17:53
【问题描述】:

我有一个将 XMLHTTPRequests 发送到处理 HTTP POST 请求并以 JSON 格式返回数据的 php 文件的站点。 post_requests 文件的 url 是公共信息(因为用户可以查看页面的 JS 代码并找到我发送 HTTP 请求的 URL)

我主要通过这样做来处理 PHP 中的 HTTP Post 请求:

//First verify XMLHTTPRequest, then get the post data
if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest')
{
  $request = file_get_contents('php://input');
  $data = json_decode($request);
  //Do stuff with the data
}

不幸的是,我很确定标题可能会被欺骗,并且一些不正当的用户或点击机器人只会向我的帖子请求发送垃圾邮件,反复查询我的数据库,直到我的网站出现故障或他们陷入困境。

我不确定他们的请求是否会在他们的请求冻结服务器方面发挥巨大作用(因为每秒 20 个请求并不多)。我应该为此做点什么吗? (尤其是在 DDOS 攻击的情况下)。我听说过速率限制,您可以在每次某些 IP 请求数据时记录一个实例,然后跟踪它们是否属于垃圾邮件:

INSERT INTO logs (ip_address, page, date) values ('$ip', '$page', NOW())
//And then every time someone loads the php post request, check to see if they loaded the same one in the past second or 10 seconds

但这意味着每次普通用户提出请求时,我都必须消耗资源来记录它们。是否有标准或更好的“实践”(可能是一些服务器配置?)来防止或处理他的问题?

编辑:只是为了澄清。我指的是有人编写了一个软件(带有 cookie 或已登录),该软件每秒仅向我网站上的所有 PHP 发布请求文件发送数百万个请求。

【问题讨论】:

  • 好吧,在 DDOS 的情况下,速率限制可能甚至没有帮助,因为它们通常会在请求中欺骗 IP 地址和/或通过多个系统发送它。我建议只来回传递每个会话唯一的令牌。
  • 对,我知道这会有什么帮助,但我更多的是询问例如。有人编写软件(带有 cookie 或已登录),每秒仅向我网站上的所有帖子请求发送数百万个请求。令牌如何防止这种情况?这不是每次请求都会生成数百万个令牌吗?
  • 抱歉,我不太了解您的 CSRF 保护。我只是在我的 Javascript 文件中生成一些服务器期望作为输出数据的回报,但标准用户无法猜测?不过,我怎样才能向用户隐藏这些“独特”数据?
  • CSRF 保护对恶意客户端毫无帮助。您想要的是对请求进行速率限制,以防止恶意客户端从单个客户端轻松攻击您的服务器。

标签: javascript php mysql


【解决方案1】:

解决方案是对请求进行速率限制,通常是按客户端 IP。

大多数网络服务器都有可以执行此操作的模块,因此请使用其中一个 - 这样您的应用程序只会接收它应该处理的请求。


【讨论】:

    【解决方案2】:

    你可以做很多事情:

    • 使用令牌来验证请求。将令牌保存在会话中,并且每个令牌只允许一定数量的请求(例如 20)。还要让令牌在一段时间后过期(例如 5 分钟)。确切的值取决于您的站点使用模式。这当然不会阻止攻击者,因为他可能会刷新站点并获取新令牌,但这是一个很小且几乎没有成本的恶化。

    • 拥有令牌后,在多次令牌刷新请求后需要验证码。还要根据您的使用模式进行调整,以避免向普通用户显示验证码。

    • 调整服务器的防火墙规则。使用 iptables connlimit 和最近的模块(参见http://ipset.netfilter.org/iptables-extensions.man.html)。这将降低您的 http 服务器处理的请求率,因此更难耗尽资源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 2017-08-31
      • 1970-01-01
      • 1970-01-01
      • 2012-12-10
      • 2013-09-20
      • 1970-01-01
      相关资源
      最近更新 更多