识别 php2shell-scan 等扫描器 ua 并过滤访问日志,核心方法是提取 user-agent 头中的特征字符串(如 php2shell、scan)或匹配已知扫描器的指纹库,并在 web 服务器配置或应用层代码中进行拦截。具体做法是在 nginx 的 nginx.conf 中使用 if 指令判断 $http_user_agent,或在 php 脚本中读取 $_server['http_user_agent'] 进行正则匹配,一旦命中即返回 403 状态码或直接丢弃请求,从而在日志中减少无效记录或阻止恶意访问。

Nginx 配置中如何基于 UA 拦截扫描器?
在 Nginx 中拦截扫描器最直接的方式是利用 map 模块定义变量,或在 server/location 块中使用 if 语句检查 $http_user_agent。这种方法无需重启服务即可生效(需 reload),且能直接在网关层阻断请求,减轻后端压力。对于 php2shell 这类工具,其 UA 通常包含特定关键词,通过正则表达式匹配这些关键词即可实现精准过滤。

server {
listen 80;
server_name example.com;
# 定义一个变量来标记是否为恶意UA
map $http_user_agent $is_scanner {
default 0;
~*php2shell 1;
~*scan 1;
~*nikto 1;
}
location / {
# 如果匹配到扫描器UA,直接返回403
if ($is_scanner) {
return 403 "Forbidden";
}
root /var/www/html;
index index.php;
try_files $uri $uri/ /index.php?$query_string;
}
}
上述配置中,map 块定义了 $is_scanner 变量,当 $http_user_agent 匹配 ~*php2shell、~*scan 或 ~*nikto 时,该变量值为 1。在 location 块中,通过 if ($is_scanner) 判断,若为真则返回 403。这种方式能有效过滤掉大部分基于知名扫描器 UA 的请求,确保只有正常用户的请求进入后端处理逻辑。
PHP 应用层如何动态过滤非法 UA?
除了 Nginx 层拦截,在 PHP 应用内部也可以实现对 UA 的动态过滤。这适用于需要更复杂逻辑判断的场景,例如记录特定 UA 的行为、动态调整黑名单或结合 IP 信誉评分。通过在入口文件(如 index.php)中早期执行检查,可以迅速终止非法请求的执行流程。使用正则表达式匹配 $_SERVER['HTTP_USER_AGENT'] 是常见做法,能够灵活应对各种变体的扫描器 UA。

<?php // index.php
$scanner_patterns = [
'/php2shell/i',
'/scan/i',
'/nikto/i',
'/sqlmap/i'
];
$user_agent = $_SERVER['HTTP_USER_AGENT'] ?? '';
foreach ($scanner_patterns as $pattern) {
if (preg_match($pattern, $user_agent)) {
http_response_code(403);
exit('Access Denied');
}
}
// 正常业务逻辑继续执行
require_once 'bootstrap.php';
?>
这段 PHP 代码定义了一个包含多个扫描器特征的正则数组,遍历当前请求的 User-Agent 进行匹配。一旦发现匹配项,立即设置 HTTP 响应码为 403 并退出脚本,防止后续代码执行。这种方式提供了比 Nginx 更细粒度的控制,例如可以根据匹配到的具体模式记录不同的日志信息,或者结合其他条件(如 IP 白名单)进行例外处理。
当 UA 被伪造为空字符串时如何处理?
在实际攻击场景中,攻击者可能会将 User-Agent 设置为空字符串或完全移除该头部,以绕过基于 UA 特征的简单过滤规则。此时,仅依赖 UA 匹配将无法有效识别恶意请求。为了应对这种情况,需要结合其他请求特征进行综合判断,例如检查请求频率、路径模式或引入验证码机制。在代码层面,可以将空 UA 视为可疑行为,触发额外的验证步骤或限制访问。
<?php $user_agent = $_SERVER['HTTP_USER_AGENT'] ?? '';
// 如果 UA 为空,视为可疑请求
if (empty($user_agent)) {
// 可以选择记录日志、返回验证码或直接拒绝
error_log('Suspicious request with empty UA from ' . $_SERVER['REMOTE_ADDR']);
http_response_code(403);
exit('Access Denied');
}
// 原有的扫描器 UA 检查逻辑...
?>
在上述代码中,增加了对空 User-Agent 的检查。如果 $_SERVER['HTTP_USER_AGENT'] 为空或未设置,脚本会记录一条错误日志并返回 403 错误。这种策略能够有效拦截那些试图通过隐藏 UA 来逃避检测的攻击者,同时提醒管理员关注潜在的异常活动。当然,空 UA 也可能来自某些特殊的客户端或爬虫,因此在实际部署时需权衡误报率,必要时可结合 IP 信誉库或行为分析进行更精准的识别。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











