【发布时间】: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