☰
PHP 实战:网站突然出现大量恶意请求怎么办?从Nginx防护到PHP安全加固完整方案
2026/9/30 7:40:12 网站建设 项目流程

一、问题背景:网站访问正常,但服务器压力突然升高

最近维护一个 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防护

线上系统只有建立多层防护,

才能在面对异常访问时保持稳定。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询