本文目录导读:

为PHP项目设置防火墙规则,通常包括服务器级别的网络防火墙(如iptables、ufw、云服务商的安全组)和应用层防护(如PHP配置、WAF),以下是分步指南:
确定项目暴露的端口和服务
- Web服务:通常为 80(HTTP)、443(HTTPS)。
- 数据库:MySQL(3306)、PostgreSQL(5432),仅允许本地或内网访问。
- 其他服务:Redis(6379)、Memcached(11211),同样应限制来源。
- 管理接口:如phpMyAdmin、后台路径,建议绑定到特定IP或VPN。
服务器级别防火墙(以Linux为例)
方案A:使用iptables(通用)
# 默认拒绝所有入站流量 iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT # 允许本地回环 iptables -A INPUT -i lo -j ACCEPT # 允许已建立的连接 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 开放Web端口(仅对外) iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 允许特定IP管理SSH iptables -A INPUT -p tcp --dport 22 -s 你的管理IP -j ACCEPT # 限制数据库仅本地 iptables -A INPUT -p tcp --dport 3306 -s 127.0.0.1 -j ACCEPT # 保存规则(不同发行版命令不同) iptables-save > /etc/iptables/rules.v4
方案B:使用ufw(Ubuntu/Debian)
ufw default deny incoming ufw default allow outgoing ufw allow 80/tcp ufw allow 443/tcp ufw allow from 你的IP to any port 22 # 数据库仅本地 ufw deny 3306 # 或限制特定内网 ufw allow from 192.168.1.0/24 to any port 3306 ufw enable
方案C:云服务商安全组(如阿里云、AWS)
- 在控制台创建安全组规则,与上述逻辑一致。
- Web端口对
0.0.0/0开放;数据库/管理端口仅对内网IP段或跳板机IP开放。
应用层防护(PHP及Web服务器)
限制PHP执行权限
- 禁用危险函数:在
php.ini中禁用exec、system、shell_exec、proc_open等。 - 禁用文件操作函数:
file_put_contents、unlink(仅在你真正需要时放开)。 - 开放基目录:
open_basedir = /var/www/html:/tmp限制PHP只能访问指定目录。 - 禁用错误输出:
display_errors = Off,error_reporting = E_ALL & ~E_NOTICE。
限制上传路径
- 上传目录 禁止执行PHP:在Nginx/Apache中配置权限。
- Nginx:
location /uploads { location ~ \.php$ { deny all; } } - Apache:
<Directory "/var/www/html/uploads"> <FilesMatch "\.php$"> Deny from all </FilesMatch> </Directory>
- Nginx:
配置WAF(Web应用防火墙)
- ModSecurity:开源WAF,可检测SQL注入、XSS等。
- Cloudflare:CDN + WAF,可拦截恶意请求。
- Laravel/ThinkPHP的中间件:对输入参数进行过滤。
数据库层防火墙
- 绑定地址:修改MySQL配置
bind-address = 127.0.0.1禁止远程连接。 - 创建专用用户:
CREATE USER 'app'@'localhost' IDENTIFIED BY '密码';仅允许本地连接。 - 限制权限:
GRANT SELECT, INSERT, UPDATE, DELETE ON 你的库.* TO 'app'@'localhost';
定期审查与监控
- 日志监控:
tail -f /var/log/nginx/access.log查看异常请求。 - 入侵检测:
fail2ban自动封禁暴力破解IP(如SSH、WordPress登录)。 - 定期扫描:使用
nmap扫描暴露端口,确认无多余服务。
生产环境示例(完整配置)
# 开放端口 80/tcp (HTTP) 443/tcp (HTTPS) 22/tcp (SSH,限制特定IP) # 禁止外网访问 3306/tcp (MySQL) 6379/tcp (Redis) 8080/tcp (如phpMyAdmin) # 应用层 - 上传目录禁止PHP执行 - 禁用危险PHP函数 - 开启URL白名单(如仅index.php允许访问)
- 优先级:先做网络防火墙(限制端口),再做应用层(限制PHP行为)。
- 最小权限原则:只开放必要端口,数据库/管理端口绝不暴露公网。
- 定期更新:PHP版本、Web服务器、防火墙规则随业务变化而调整。
如果你使用云服务器,安全组规则通常是最高效的方案;如果是自建服务器,ufw 或 iptables 足够,对于高安全性要求,可额外部署WAF或企业级防火墙。