ModSecurity默认启用的OWASP CRS规则会误判phpMyAdmin合法操作为攻击,因其对/phpmyadmin/等路径及SQL、base64、LFI相关规则过于敏感;应通过Apache的块配合SecRuleRemoveById和SecRuleUpdateTargetById对特定规则ID和参数(如token、sql_query)精准放行,而非全局禁用。
为什么默认规则会把 phpMyAdmin 当成攻击目标
modsecurity 默认启用的 owasp crs 规则集对 phpmyadmin 的常见请求路径(如 /phpmyadmin/index.php、/pma/)非常敏感,尤其是 sql 关键字检测、双斜杠绕过模式、base64 编码参数等规则,容易把合法登录、表结构导出、sql 查询等操作误判为 sqli 或 lfi。
- 典型错误现象:
403 Forbidden响应 + 日志里出现Matched "Operator `Rx' with parameter `(?i:(?:%2f%2e%2e|%2e%2e%2f|.\.|./.)`'或SQL injection detected - 根本原因:CRS 中的
REQUEST-930-APPLICATION-ATTACK-LFI和REQUEST-942-APPLICATION-ATTACK-SQLI规则未区分管理后台与普通 Web 路径 - 不建议全局禁用规则——只对
phpMyAdmin路径做精准放行更安全
如何在 Apache 配置中为 phpMyAdmin 关闭特定规则
关键不是关掉 ModSecurity,而是用 SecRuleUpdateTargetById 和 SecRuleRemoveById 在 Location 块里做局部豁免。Apache 的 <location></location> 指令比 <directory></directory> 更适合匹配 URL 路径(尤其当 phpMyAdmin 是 alias 或符号链接时)。
- 确认 phpMyAdmin 实际访问路径,比如是
/phpmyadmin还是/pma—— 这个值要和<location></location>里的路径完全一致 - 在 Apache 虚拟主机或主配置中添加如下块(不要放在 .htaccess 里,ModSecurity 不读它):
<location>
SecRuleRemoveById 930100 930110 942100 942150 942200
SecRuleUpdateTargetById 932100 !ARGS:token
SecRuleUpdateTargetById 942100 !ARGS:sql_query !ARGS:import_text
</location>
-
930100/930110:LFI 相关规则,phpMyAdmin 的导入/导出功能常触发 -
942100/942150/942200:SQLi 检测核心规则,但仅移除,不关闭整个规则文件 -
!ARGS:token表示跳过对token参数的 932100(CSRF token 校验)检查,避免登录失败
phpMyAdmin 的 token 和 session 参数必须显式放行
phpMyAdmin 依赖 token、server、lang、collation_connection 等参数传递状态,而 CRS 默认会对所有 ARGS 执行正则扫描。如果只屏蔽路径不放行参数,仍会因 base64 编码的 token 或含下划线的 collation_connection 值被拦截。
- 常见错误现象:登录页反复跳转、点击“执行”后空白、导出 CSV 失败,日志显示
Matched "Operator `Rx' with parameter `base64_'` - 必须用
SecRuleUpdateTargetById显式排除这些参数,例如:
SecRuleUpdateTargetById 920170 !ARGS:token !ARGS:server !ARGS:lang !ARGS:collation_connection
-
920170是 base64 检测规则,phpMyAdmin 的token是标准 base64url 编码,必然触发 - 不要写
!ARGS(全禁),那等于关掉所有参数检查,风险太大 - 如果用了自定义别名(如
/dbadmin),<location></location>和参数放行都要同步更新
验证是否生效及常见遗漏点
改完配置后 reload Apache,但 ModSecurity 的规则加载顺序和缓存行为会让测试结果滞后。真正生效前必须确认三件事。
- 运行
apachectl -t确保语法无误,再systemctl reload apache2(非 restart) - 打开 ModSecurity 的审计日志(
SecAuditLog /var/log/modsec_audit.log),用 curl 模拟一次登录请求,检查日志里是否还有针对/phpmyadmin/路径的拦截记录 - 最容易被忽略的是:phpMyAdmin 的子路径(如
/phpmyadmin/import.php、/phpmyadmin/export.php)可能被其他 Location 块覆盖,或者用了重写规则(RewriteRule)导致 ModSecurity 匹配不到原始 URI - 如果用了反向代理(如 Nginx 前置),ModSecurity 必须部署在最终处理 PHP 的 Apache 层,否则规则不生效
复杂点在于 phpMyAdmin 版本升级后新增的参数名(比如 5.2+ 的 navigation_tree_table_filter)可能没被放行,得看日志动态补漏。别指望一套配置一劳永逸。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











