繁体   English   中英

防止向 php 发送垃圾邮件 XMLHTTP 请求

[英]Preventing spammy XMLHTTP requests to php

我有一个站点将 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 发布请求文件发送数百万个请求。

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

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


你可以做很多事情:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM