2015-06-16 33 views
2

我有一个网站发送XMLHTTPRequests到一个PHP文件,它处理HTTP POST请求并返回JSON格式的数据。 post_requests文件的网址是公开信息(因为用户只能查看页面的JS代码并找到我要发送HTTP请求的URL)防止spammy XMLHTTP请求到php

我主要在PHP中处理HTTP Post Requests:

//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请求文件发送数百万个请求。

+3

使用类似CSRF保护的东西,在服务器已知的页面上随机输出一些内容,并检查它是否存在,请求不是来自您的站点。 – adeneo

+1

那么,在DDOS的情况下,速率限制可能甚至不会有帮助,因为它们通常欺骗请求中的IP地址和/或通过多个系统发送它。我建议只传递一个来自每个会话的唯一标记。 –

+0

对,我可以看到这会有什么帮助,但我更多的要求。某人编写软件(使用cookie或已登录),每秒向我的网站上的所有发布请求发送数百万次请求。令牌如何防止这种情况发生?这不就是说每个请求都会产生数百万个令牌吗? –

回答

2

解决方法是通过每个客户端IP对请求进行速率限制。

大多数网络服务器都有模块可以做到这一点,所以请使用其中的一个模块 - 这样,您的应用程序只接收它要处理的请求。


-1

有很多事情可以做:

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

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

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