本文目录导读:

针对PHP项目的恶意访问行为识别与拦截,可以从请求特征、行为模式、攻击载荷三个维度进行识别,并通过Web服务器层、应用层、WAF层三级防御体系进行拦截。
以下是具体的识别特征与拦截方案:
恶意访问行为特征识别
请求特征识别(基于HTTP协议层)
- 非正常HTTP方法: 除了
GET/POST/PUT/DELETE外,出现OPTIONS(探测漏洞)、TRACE、CONNECT(代理隧道)、PATCH等非常用方法。 - User-Agent异常:
- 为空或包含特殊字符:
\x00、\n\r(换行注入)。 - 非浏览器UA:脚本扫描器(
python-requests、Go-http-client、curl/7.x、Wget、okhttp等)。 - 伪装但不符合规范的UA:
Mozilla/5.0后缺少括号内的操作系统/浏览器详细信息。
- 为空或包含特殊字符:
- Referer异常: 直接访问需要登录后的内部链接(如
/admin/)且Referer为空或来自外部。 - 请求频率异常: 同一IP在短时间内(如1秒内)访问超过50次,或反复请求不存在的路径(404探活)。
攻击载荷特征识别(基于业务层)
- 常见攻击模式:
- SQL注入: 携带
union select、1=1、sleep()、、、、 或 异常闭合。 - XSS攻击: 携带
<script>、<img src=x>、onerror=、javascript:、prompt()、alert()。 - 命令注入/文件包含: 携带
system()、exec()、eval()、passthru()、include()、require()或路径穿越 。 - 文件上传:
Content-Type为application/octet-stream但文件名为.php、.phtml、.php5、.shtml等脚本后缀。 - 扫描探测: 包含常见漏洞路径:
/phpinfo.php、/wp-admin/、/admin、/config.php、/web-INF/、/.git/、/.env。
- SQL注入: 携带
行为模式识别(基于用户画像)
- 爬行扫描行为: 在短时间内(如<30秒)遍历
/?p=1、?p=2...?p=1000。 - 参数污染行为: 同一参数出现两次且值不同(如
?id=123&id=456)。 - 静态资源请求异常: 请求
.jpg、.css等文件时携带大量查询参数(如jpg?cmd=id)。 - POST体过小或过大: POST请求体大小为0字节(探测性提交),或超过正常业务范围(如1KB以下或50MB以上)。
拦截策略与实现方案
Nginx层(性能最高,建议首选)
在 server 或 location ~ \.php$ 块中添加规则:
# 1. 拦截非正常User-Agent
if ($http_user_agent ~* (curl|wget|python-requests|Go-http-client|okhttp|java/|libwww-perl) ) {
return 403;
}
# 2. 拦截SQL注入关键词(GET/POST/COOKIE)
if ($query_string ~* "union.*select.*from|sleep\(|benchmark\(|1=1|1=2|'[^']*'") {
return 403;
}
# 3. 拦截文件包含/遍历
if ($query_string ~* "\.\./|\.\.\\) |/etc/passwd|/proc/self") {
return 403;
}
# 4. 限制请求速率(同一IP 20次/秒)
limit_req_zone $binary_remote_addr zone=one:10m rate=20r/s;
location / {
limit_req zone=one burst=10 nodelay;
}
# 5. 限制PHP文件访问范围(非必要路径禁止访问)
location ~* /(uploads|images|assets)/.*\.php$ {
deny all;
}
PHP应用层(灵活性最高)
在 index.php 或 公共入口文件 中引入安全校验逻辑:
<?php
class SecurityInterceptor {
// 黑名单特征正则(可配置化)
private static $patterns = [
'sql_injection' => '/\b(union\s+select|sleep\(|benchmark\(|1=1|(--|\#))\b/i',
'xss' => '/<script\b[^>]*>|onerror=|alert\(|prompt\(|javascript\s*:/i',
'rfi_lfi' => '/\.\.\/|\.\.\\\\|php:\/\/input|php:\/\/filter/i',
'cmd_injection' => '/system\(|exec\(|shell_exec\(|passthru\(|eval\(|assert\(/i'
];
public static function check() {
// 扫描GET/POST/COOKIE/HEADER/REQUEST
$inputs = array_merge($_GET, $_POST, $_COOKIE, $_SERVER);
foreach ($inputs as $key => $value) {
if (is_string($value) && self::patternMatch($value)) {
self::logAttack($key, $value);
http_response_code(403);
die('Request blocked due to security reason.');
}
}
// 检查请求频率(使用Redis或内存表)
if (self::isRateLimited()) {
http_response_code(429);
die('Too many requests.');
}
}
private static function patternMatch($value) {
foreach (self::$patterns as $type => $pattern) {
if (preg_match($pattern, urldecode($value))) {
return true;
}
}
return false;
}
private static function isRateLimited() {
$ip = $_SERVER['REMOTE_ADDR'];
$key = 'rate_limit:' . $ip;
// 1秒内不超过20次
$count = apcu_inc($key, 1, $success);
if (!$success || $count == 1) {
apcu_store($key, 1, 1); // 1秒过期
return false;
}
return $count > 20;
}
}
// 在项目最顶部执行
SecurityInterceptor::check();
Web应用防火墙(WAF)层(功能全面)
推荐开源方案:基于OpenResty的Naxsi或lua-resty-waf
示例(lua-resty-waf):
# nginx.conf
lua_package_path "/path/to/resty-waf/lib/?.lua;";
server {
access_by_lua_block {
local waf = require "resty.waf"
local waf_instance = waf:new()
-- 启用SQLi防护
waf_instance:set_option("rule_vtype_blacklist", "SQLI")
-- 启用CMD执行防护
waf_instance:set_option("rule_vtype_blacklist", "CMDEXE")
-- 白名单信任IP(如运维IP)
waf_instance:set_option("whitelist", {"127.0.0.1", "192.168.1.0/24"})
waf_instance:execute()
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php-fpm.sock;
include fastcgi_params;
}
}
高级行为分析策略(推荐用于高安全项目)
如果基础规则误杀率较高(如用户可能在评论中输入 alert('hello')),建议引入行为分析:
-
IP信誉分机制:
- 每次触发可疑行为 +5分。
- 正常浏览(如点击、停留、填写表单) -2分。
- 分数 > 20:弹出验证码。
- 分数 > 50:临时封禁30分钟。
-
基于Session的异常检测:
- 用户从未申请验证码,却直接提交登录请求(高频暴力破解特征)。
- 页面正常浏览时间 < 200ms(极有可能是自动化脚本)。
-
HTTP & HTTPS 强制校验:
- CSRF Token验证: 所有POST请求必须携带有效的CSRF Token(来自页面渲染)。
- Referer白名单: 后台管理入口严格校验
Referer为项目域名。
监控与告警建议
- 日志分析: 配合
ELK或Loki,对Nginxaccess.log中的403/404请求按IP、路径做聚合分析。 - 自动联动封禁: 使用
fail2ban监控PHP错误日志(如频繁的PHP Fatal error: Uncaught mysqli_sql_exception),自动添加iptables规则封禁IP。 - 蜜罐诱饵: 在
/robots.txt中故意暴露一个假的后台路径/admin-hidden-area,访问该路径的IP直接永久加入黑名单。
总结建议
| 层级 | 推荐方案 | 适用场景 |
|---|---|---|
| 网络层 | 云WAF (阿里云/Cloudflare) | 无服务器维护成本,抗大流量CC |
| Web层 | Nginx if + limit_req |
高并发场景,性能损耗低 |
| 应用层 | 自定义拦截器 + 行为分析 | 业务逻辑复杂,需精细化控制 |
| 数据库层 | 参数化查询 (PDO/PreparedStatement) | 最根本的防SQL注入手段 |
建议组合:60%规则拦截(Nginx) + 30%行为分析(PHP) + 10%蜜罐/联动封禁(Fail2ban),可有效防御99%以上的自动化恶意访问。