一、问题背景:网站访问正常,但服务器压力突然升高
最近维护一个 PHP 内容管理系统,运维发现:
网站没有明显业务增长,但是服务器请求量突然增加。
监控:
服务器: CPU:90% 内存:正常 访问量: 平时: 5000次/小时 异常: 20万次/小时用户访问:
首页: 偶尔打不开 后台: 登录缓慢二、问题定位:发现大量异常URL请求
查看 Nginx access.log:
tail -f /var/log/nginx/access.log发现:
GET /admin/login.php GET /wp-login.php GET /config.php GET /api/test.php大量重复访问。
特点:
- 请求路径不存在
- IP数量很多
- 请求频率异常
三、为什么恶意请求会影响PHP?
很多 PHP 项目:
所有请求:
都会进入程序。
流程:
用户请求 ↓ Nginx ↓ index.php ↓ PHP初始化 ↓ 数据库连接 ↓ 返回404即使页面不存在:
也消耗:
- PHP进程
- CPU
- 数据库连接
四、第一步:静态错误请求不要进入PHP
错误架构:
不存在文件 ↓ PHP处理 ↓ 返回404优化:
Nginx直接处理。
配置:
location / { try_files $uri $uri/ /index.php?$query_string; }效果:
真实文件:
直接返回。
不存在:
统一处理。
五、第二步:限制单IP访问频率
如果:
一个IP:
一分钟请求几千次。
需要限制。
Nginx:
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;使用:
location /api/ { limit_req zone=req_limit burst=20 nodelay; }效果:
超过频率:
排队或者拒绝。
六、第三步:限制连接数量
防止:
一个客户端:
建立大量连接。
配置:
limit_conn_zone $binary_remote_addr zone=addr:10m;使用:
location / { limit_conn addr 20; }七、第四步:禁止访问敏感文件
很多攻击:
扫描配置文件。
例如:
.env .git config.php backup.sql禁止:
location ~ /\.(git|env) { deny all; }八、第五步:PHP关闭危险功能
查看:
php -i | grep disable_functions配置:
disable_functions= exec, shell_exec, system, passthru避免:
WebShell执行系统命令。
九、第六步:上传文件安全处理
很多漏洞:
来自文件上传。
错误:
move_uploaded_file( $file, "upload/".$name );问题:
用户可能上传:
PHP文件。
例如:
shell.php优化:
限制后缀:
$allow=[ "jpg", "png", "webp" ];检测:
$ext= pathinfo( $file, PATHINFO_EXTENSION ); if(!in_array($ext,$allow)){ exit("禁止上传"); }十、防止上传目录执行PHP
即使上传:
也不能执行。
Nginx:
location /upload { location ~ \.php$ { deny all; } }十一、第七步:SQL注入防护
危险:
$sql= "SELECT * FROM user WHERE id=".$id;攻击:
?id=1 OR 1=1使用预处理:
$stmt=$pdo->prepare( "SELECT * FROM user WHERE id=?" ); $stmt->execute([$id]);十二、第八步:XSS攻击防护
危险:
echo $_GET['name'];攻击:
<script>alert(1)</script>输出过滤:
echo htmlspecialchars( $name, ENT_QUOTES, 'UTF-8' );十三、第九步:CSRF防护
场景:
用户登录后台。
攻击页面:
自动提交请求。
解决:
Token。
生成:
$_SESSION['csrf']= bin2hex( random_bytes(16) );提交:
验证Token。
十四、第十步:增加安全响应头
Nginx:
add_header X-Frame-Options SAMEORIGIN; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block";减少:
浏览器攻击风险。
十五、日志分析定位攻击来源
统计IP:
awk '{print $1}' access.log | sort | uniq -c | sort -nr查看:
请求最多IP。
分析:
IP: 1.1.1.1 请求: 50000次然后:
结合防火墙处理。
十六、使用CDN/WAF进行前置过滤
架构:
用户 ↓ CDN/WAF ↓ Nginx ↓ PHP攻击请求:
在入口过滤。
减少:
服务器压力。
十七、生产环境常见错误
1. 只靠PHP判断攻击
问题:
请求已经消耗资源。
应该:
前置过滤。
2. 上传目录直接执行PHP
风险:
上传漏洞。
3. 数据库账号权限过高
错误:
root账号运行网站应该:
使用业务账号。
4. 错误日志暴露
生产环境:
禁止显示详细错误。
配置:
display_errors=Off log_errors=On十八、上线前安全检查清单
Nginx
✅ 请求限速
✅ 限制连接
✅ 禁止敏感文件
PHP
✅ 关闭危险函数
✅ 输入过滤
✅ 错误隐藏
数据库
✅ 预处理SQL
✅ 最小权限账号
✅ 定期备份
上传
✅ 文件类型限制
✅ 上传目录禁止执行PHP
十九、优化效果
优化前:
大量异常请求 ↓ PHP全部处理 ↓ 服务器资源耗尽 ↓ 网站卡顿优化后:
请求进入 ↓ Nginx过滤 ↓ 恶意请求拦截 ↓ PHP处理正常业务总结
PHP网站安全:
不是只靠代码。
完整防护需要:
Nginx限流 + PHP安全配置 + SQL防注入 + 上传保护 + 日志监控 + CDN/WAF防护线上系统只有建立多层防护,
才能在面对异常访问时保持稳定。