防止垃圾邮件XMLHTTP请求到PHP

时间:2015-06-16 22:01:24

标签: javascript php mysql

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

2 个答案:

答案 0 :(得分:2)

解决方案是对每个客户端IP的速率限制请求。

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

答案 1 :(得分:-1)

你可以做很多事情:

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

  • 一旦有了令牌,在几次令牌刷新请求后需要验证码。同时根据您的使用模式进行调整,以避免向常规用户显示验证码。

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