本文目录导读:

- 在 Apache 下使用 ModSecurity 保护 PHP
- 在 Nginx 下使用 ModSecurity 保护 PHP
- 针对 PHP 应用的常见 ModSecurity 配置调优
- 不推荐但可以尝试的方案:PHP 中的 WAF 替代品
这是一个比较具体的技术问题,需要澄清一个常见的概念混淆:
PHP 本身没有“ModSecurity”,ModSecurity 是一个 Web 应用防火墙(WAF)模块,它通常是作为 Apache、Nginx 或 IIS 的一个扩展来运行的,而不是 PHP 的一个扩展。
问题的准确理解应该是:“在运行 PHP 的 Web 服务器(如 Apache/Nginx)上,如何安装和配置 ModSecurity 来保护 PHP 应用?”
下面分别针对 Apache 和 Nginx 两种最常见的搭配,给出具体的操作步骤。
在 Apache 下使用 ModSecurity 保护 PHP
这是最传统、最成熟的方式。
安装 ModSecurity
-
Ubuntu/Debian:
sudo apt update sudo apt install libapache2-mod-security2
-
CentOS/RHEL: (需要 EPEL 和 REMI 源)
sudo yum install epel-release sudo yum install mod_security
启用并配置基本规则
安装后,ModSecurity 默认是关闭的,只有检测模式(只记录,不拦截)。
# 启用模块 sudo a2enmod security2 # 复制推荐配置文件 sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf # 编辑配置文件,设置为开启(ON) sudo vi /etc/modsecurity/modsecurity.conf
将这一行修改:
SecRuleEngine DetectionOnly
改为:
SecRuleEngine On
配置规则(PHP 相关)
ModSecurity 本身没有规则,需要安装 OWASP ModSecurity Core Rule Set (CRS),这是最常用的规则集。
-
下载 CRS:
sudo git clone https://github.com/coreruleset/coreruleset /etc/modsecurity/crs
-
加载规则: 在 Apache 的配置文件(或
/etc/apache2/modsecurity.conf)中包含规则文件。 通常是在/etc/apache2/mods-enabled/security2.conf或/etc/httpd/conf.d/mod_security.conf中添加:IncludeOptional "/etc/modsecurity/crs/crs-setup.conf" IncludeOptional "/etc/modsecurity/crs/rules/*.conf"
-
针对 PHP 的特别说明:
- 文件上传漏洞:CRS 中的
REQUEST-920-PROTOCOL-ENFORCEMENT.conf和REQUEST-933-APPLICATION-ATTACK-PHP.conf会自动处理常见的 PHP 文件上传攻击(如拦截eval(,base64_decode(等危险函数)。 - 文件包含防护:
REQUEST-930-APPLICATION-ATTACK-LFI.conf会拦截常见的 路径遍历攻击。 - SQL 注入防护:会自动保护使用 PHP 进行数据库查询的应用。
- 文件上传漏洞:CRS 中的
测试
创建一个小 PHP 文件测试:
<?php echo "test"; // 模拟攻击:访问 ?id=1 UNION SELECT ... ?>
访问 http://your-server/test.php?id=1 AND 1=1,ModSecurity 生效,你会收到 403 Forbidden 拒绝访问。
在 Nginx 下使用 ModSecurity 保护 PHP
Nginx 不像 Apache 那样支持动态模块,需要使用 ModSecurity 的 Nginx 连接器 (libmodsecurity3)。
编译安装 Nginx + ModSecurity (复杂,推荐)
大多数 Linux 发行版默认的 Nginx 没有包含 ModSecurity,你需要从源码编译,或者使用第三方仓库(如 OpenResty 或官方 nginx-module)。
-
Ubuntu/Debian(使用 PPA):
sudo add-apt-repository ppa:ondrej/nginx-mainline sudo apt update sudo apt install nginx libnginx-mod-http-modsecurity
-
CentOS/RHEL(使用 EPEL + Nginx 官方源):
sudo yum install nginx-mod-http-modsecurity
配置 Nginx 加载模块
在 /etc/nginx/nginx.conf 的 events 块之前添加:
load_module modules/ngx_http_modsecurity_module.so;
配置 ModSecurity
在 server 块中启用:
server {
listen 80;
server_name example.com;
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;
# PHP 处理部分
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock; # 根据你的 PHP 版本调整
}
}
创建 ModSecurity 配置文件和规则
创建 /etc/nginx/modsec/main.conf 文件,内容如下:
# 启用引擎 SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On # 包含 OWASP CRS 规则集(类似 Apache 步骤) Include /etc/nginx/modsec/crs/crs-setup.conf Include /etc/nginx/modsec/crs/rules/*.conf
记得也要下载 CRS 并放到 /etc/nginx/modsec/crs/ 目录下。
重启 Nginx 测试
sudo nginx -t sudo systemctl restart nginx
针对 PHP 应用的常见 ModSecurity 配置调优
直接启用 CRS 可能会对你的正常 PHP 应用造成误杀,需要调整几个地方:
-
排除管理后台: 如果你有
/admin或/wp-admin(WordPress)路径,可以放行一些规则的检查。<LocationMatch "/admin"> SecRuleRemoveById 933210 933211 # 移除 PHP 特定攻击检测 </LocationMatch> -
处理大文件上传: PHP 应用经常需要上传文件,默认的
SecRequestBodyLimit(1GB) 一般够用,但需要调整SecRequestBodyInMemoryLimit。SecRequestBodyInMemoryLimit 128000 SecRequestBodyLimit 1073741824 # 1GB,与 php.ini 中的 upload_max_filesize 匹配
-
处理 JSON/XML 接口: 如果你用 PHP 写 REST API(如 Laravel、Symfony),要确保 Content-Type 为
application/json或application/xml的请求不被错误拦截。# 允许 JSON 请求体 SecAction "id:1,phase:1,pass,nolog,ctl:requestBodyProcessor=JSON"
不推荐但可以尝试的方案:PHP 中的 WAF 替代品
如果你完全无法控制 Web 服务器(比如说你只有共享主机),虽然你无法使用 ModSecurity,但你可以在 PHP 代码层面实现简单的防护,但这远不如 ModSecurity 强大。
- PHP-IDS (PHP Intrusion Detection System):一个纯 PHP 实现的简单检测库(但已多年未更新,不推荐用于生产环境)。
- Laravel/Symfony 内置的中间件:这些框架的
ValidatePostSize、ThrottleRequests等内置中间件可以防CC和部分攻击。 - Cloudflare / CloudFront WAF:在更前端的 CDN 层使用 WAF,比在 PHP 代码里处理更高效。
| 情况 | 推荐方案 |
|---|---|
| 你有 Web 服务器(Apache/Nginx)控制权 | 安装 ModSecurity + OWASP CRS(最推荐) |
| 你只负责 PHP 代码,服务器已配置 | 配合服务器管理员,在现有配置中为你的 PHP 站点添加排除规则 |
| 你完全无法控制服务器 | 使用 Cloudflare WAF 或代码层面的基础防护(不推荐只用代码) |
核心操作顺序:
- 安装 ModSecurity 到 Web 服务器。
- 安装 OWASP CRS 规则集。
- 修改
SecRuleEngine On。 - 测试,并根据你的 PHP 应用(后台、上传、API)调整排除规则。
如果你在执行上述操作中遇到具体的错误提示(AH00526 配置错误、或者某个规则误杀),可以贴出错误日志,我可以进一步帮你分析。