PHP请求速率限制对CURL请求失效,如何修复?
如何让基于Session的HTTP请求速率限制对CURL请求生效?
我从网上获取了一段用于限制HTTP请求的函数,代码如下:
session_start(); if (isset($_SESSION['LAST_CALL'])) { $last = strtotime($_SESSION['LAST_CALL']); $curr = strtotime(date("Y-m-d h:i:s")); $sec = abs($last - $curr); if ($sec <= 2) { die('Rate Limit Exceeded'); // rate limit } } $_SESSION['LAST_CALL'] = date("Y-m-d h:i:s");这个函数在浏览器中能正常生效,但用CURL命令
curl http://localhost/project/p.php请求时,速率限制完全没触发。请问该怎么修改代码,让速率限制对CURL请求也起作用?
嘿,这个问题我太熟了!核心原因就是Session依赖Cookie,而CURL默认不处理Cookie。浏览器会自动帮你保存和发送Session对应的Cookie,但CURL每次请求都是“全新会话”,服务器根本认不出这是同一个客户端的重复请求,自然不会触发速率限制。下面给你两步搞定:
第一步:修改PHP代码,强制要求客户端支持Cookie
在你的速率限制代码最前面加一段检查,确保客户端能接收Cookie——这样既能过滤掉不支持Cookie的请求,也能迫使CURL必须处理Cookie才能访问:
// 先发送一个测试Cookie给客户端 setcookie('test', 1, time()+3600); // 检查客户端是否接收了Cookie if(count($_COOKIE) == 0){ die ("Cookie Not Enabled"); } // 原有的速率限制代码放在这里 session_start(); if (isset($_SESSION['LAST_CALL'])) { $last = strtotime($_SESSION['LAST_CALL']); $curr = strtotime(date("Y-m-d h:i:s")); $sec = abs($last - $curr); if ($sec <= 2) { die('Rate Limit Exceeded'); // rate limit } } $_SESSION['LAST_CALL'] = date("Y-m-d h:i:s");
第二步:调整CURL命令,正确处理Cookie
用CURL请求时,你得告诉它保存Cookie,并且下次请求带上这个Cookie,这样服务器才能识别出是同一个会话:
- 第一次请求(保存Cookie到本地文件):
这里的curl http://localhost/project/p.php -c cookie-jar.txt-c cookie-jar.txt会把服务器返回的Cookie(包括PHPSESSID)保存到cookie-jar.txt文件里。 - 后续请求(携带Cookie发起请求):
你有两种方式可选,都能让服务器识别你的会话:
现在你连续快速请求的话,服务器就会触发速率限制,返回# 方式1:直接使用刚才保存的Cookie文件 curl http://localhost/project/p.php -b cookie-jar.txt # 方式2:从Cookie文件里取出PHPSESSID,手动指定 curl http://localhost/project/p.php --cookie "PHPSESSID=g90tqc0hvp6sodods9jisss912"Rate Limit Exceeded啦!
内容的提问来源于stack exchange,提问作者Programmer
相关产品推荐
相关产品推荐

