Express.js的req.url为何会出现第三方完整URL而非路径?
完整URL出现在req.url中的产生原因
HTTP 1.1协议标准明确规定,请求行的请求目标支持4种格式,其中绝对格式(absolute-form) 允许客户端直接发送完整URL作为请求路径,这类请求本质是客户端尝试将你的服务器作为HTTP代理使用。
当客户端构造如下格式的请求时:
GET http://icanhazip.com/ HTTP/1.1 Host: 你的服务器IP
Node.js原生http模块以及上层的Express框架会直接将完整URL赋值给req.url属性,这是协议层面的正常表现,既不是你的代码逻辑出错,也不是框架存在异常。
你日志中其他以/开头的路径都是公网恶意扫描的常规目标,包括WordPress漏洞路径、Exchange登录路径、命令注入测试路径、敏感配置文件.env路径,都是全网批量扫描的自动化请求,公网服务器几乎都会收到这类扫描请求。
这类请求的安全风险说明
- 如果你没有主动将服务器配置为开放代理服务:默认Express的路由仅匹配路径部分,这类带完整URL的请求无法命中任何业务路由,默认只会返回404,不会直接造成安全威胁。
- 需要注意潜在的代码层面风险:
- 如果你在业务逻辑中直接使用
req.url做字符串操作,比如拼接本地文件路径读取资源、直接作为重定向目标,没有提前校验req.url格式的话,可能引发路径遍历、开放重定向等漏洞。 - 日志中带shell执行命令的请求是攻击者在测试命令注入漏洞,只要你的代码中没有将请求参数未经校验直接传入系统命令执行的逻辑,就不会被这类扫描攻击成功。
- 如果你在业务逻辑中直接使用
应对建议
- 新增前置中间件过滤异常请求:只要检测到
req.url不以/开头,直接返回400或403响应,拦截所有代理尝试的请求,示例代码如下:
app.use((req, res, next) => { if (!req.url.startsWith('/')) { return res.sendStatus(403); } next(); });
- 不要将
.env、.git这类敏感文件存放在静态资源托管目录,配置目录权限避免敏感文件被直接访问。 - 若某类扫描请求频率过高,可配置防火墙封禁对应IP段减少无效请求。
内容的提问来源于stack exchange,提问作者Royston dsouza
相关产品推荐
相关产品推荐

