phpmyadmin无法防御slowloris攻击,因其是php应用,运行在web服务器之后,所有慢速连接行为(如慢发请求头)均发生在php生命周期之前,nginx/apache必须通过client_header_timeout等参数在协议层拦截。
phpmyadmin 本身不处理连接层超时,它完全依赖底层 web 服务器(nginx 或 apache)来拦截 slowloris 类攻击。单独调 phpmyadmin 的配置项(如 $cfg['logincookievalidity'] 或 max_execution_time)对慢速头、慢 post、慢读毫无作用。
为什么 phpMyAdmin 不能自己防 Slowloris
它是一个 PHP 应用,运行在 Web 服务器之后:
- HTTP 连接建立、请求头接收、请求体读取、响应发送等全过程均由 Nginx/Apache 控制,PHP 进程甚至根本不会被唤醒,直到请求头收全、body 传完(且未被缓冲截断)
-
phpMyAdmin的php.ini中max_input_time只对已进入 PHP 的请求生效;而 Slowloris 攻击者卡在 header 阶段,PHP 根本收不到这个请求 - 所有“慢速”行为都发生在 PHP 生命周期之前,
phpMyAdmin无感知、无干预能力
Nginx 下必须配置的四条 timeout 指令
若你用 Nginx + phpMyAdmin,必须在 http{} 或 server{} 块中显式设置(不能靠默认值):
-
client_header_timeout 8s;—— HTTPS 环境下设 8–12 秒,覆盖 TLS 握手延迟;攻击者发不完GET /phpmyadmin/ HTTP/1.1\r\nHost: ...\r\n\r\n就被断开 -
client_body_timeout 10s;—— 防慢 POST 登录或导入 SQL;注意保持proxy_request_buffering on;(默认),否则该超时失效 -
send_timeout 15s;—— 防 Slow Read:用户登录后点“导出大表”,却用极低速率读响应,Nginx 在两次成功 write 间隔超 15 秒就 RST 断连 -
keepalive_timeout 5s;—— phpMyAdmin 是短会话应用,长连接空闲 5 秒即关闭;配合reset_timedout_connection on;避免 TIME_WAIT 堆积
Apache 下启用 mod_reqtimeout 是唯一有效方式
Apache 默认的 Timeout 指令(300 秒)只管 header 读取初期,对 Slowloris 完全无效。必须启用并配置 mod_reqtimeout:
- 确认已加载:
LoadModule reqtimeout_module modules/mod_reqtimeout.so - 在虚拟主机或全局配置中加入:
RequestReadTimeout header=10-30,minrate=500(头必须 10 秒内开始、30 秒内结束,平均 ≥500 B/s) - 再加一行:
RequestReadTimeout body=10,minrate=500(每 10 秒内至少收到 500 字节 POST 数据) - 禁用
KeepAlive或设为KeepAliveTimeout 3,phpMyAdmin 几乎不用长连接
容易被忽略的致命细节
很多人改完配置 reload 就以为万事大吉,但实际仍可能被攻破:
- 没检查
reset_timedout_connection on;是否启用 —— 缺它的话,超时连接只是 FIN 关闭,大量连接卡在 TIME_WAIT,照样耗尽端口和 worker - 把
client_max_body_size设得极大(如 2G)又没配client_body_timeout—— 攻击者声明大 Content-Length + 极慢上传,直接撑爆内存缓冲区 - phpMyAdmin 部署在反向代理后(如 Cloudflare),却忘了在 proxy 层也同步收紧超时 —— 外层代理宽松,攻击流量直接透传到后端 Nginx
- 误信“phpMyAdmin 开了登录失败锁定就能防 Slowloris” —— 锁定的是认证逻辑,而 Slowloris 根本不走到认证那步
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











