You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:22:56