在 Web 应用防火墙 (WAF) 的拦截设置中,URI (Uniform Resource Identifier) 和 URI Path 是两个密切相关但有重要区别的概念,理解它们对于精确配置规则至关重要:
- URI (Uniform Resource Identifier)
- 定义: 这是标识网络资源的完整字符串。它包含了访问该资源所需的所有组成部分。
- 组成: 一个完整的 URI 通常包括:
- Scheme:
http://
,https://
,ftp://
等。 - Host: 域名或 IP 地址 (例如
www.example.com
,192.168.1.1
)。 - Port: (可选,如果使用标准端口如 80 或 443 则通常省略) 例如
:8080
。 - Path: 资源在服务器上的具体路径 (例如
/products/index.html
,/api/v1/users
)。 - Query String: (可选) 以
?
开头,包含传递给资源的参数 (例如?id=123&category=books
)。 - Fragment: (可选) 以
#
开头,通常用于指定资源内部的某个锚点 (例如#section2
),注意:Fragment 通常不会被发送到服务器。
- Scheme:
- WAF 中的含义: 当 WAF 规则指定匹配 URI 时,它通常指的是包含 Path + Query String 的部分(有时也可能包括 Port,但 Scheme 和 Host 通常在更早的 HTTP 头部处理阶段被处理或用于路由,而不直接作为 URI 规则匹配的一部分)。最重要的是它包含了查询参数 (
?
后面的部分)。 - 示例:
https://www.example.com:8080/products/search?q=shoes&sort=price#results
这个 URI 中,WAF 规则匹配的 URI 部分通常是/products/search?q=shoes&sort=price
(Path + Query String)。
- URI Path
- 定义: 这是 URI 中特定于资源位置的部分,它标识了目标资源在服务器上的路径或端点。
- 组成: 仅包含从域名/IP地址之后的第一个
/
开始,到?
(查询字符串开始) 或#
(片段开始) 或字符串结束为止的部分。它不包含 Scheme, Host, Port, Query String 或 Fragment。 - WAF 中的含义: 当 WAF 规则指定匹配 URI Path 时,它只关注资源的路径部分,完全忽略查询字符串 (
?
后面的所有内容)。 - 示例: 对于同一个 URI
https://www.example.com:8080/products/search?q=shoes&sort=price#results
,WAF 规则匹配的 URI Path 部分只是/products/search
。
核心区别总结:
特性 | URI (在 WAF 上下文中) | URI Path |
---|---|---|
包含内容 | Path + Query String (可能包含 Port) | 仅 Path |
是否包含查询参数 (? 后) | 是 | 否 |
用途 | 匹配包含特定参数的特定资源请求 | 匹配特定位置或端点的所有请求 |
示例 (基于请求) | /login.php?username=admin | /login.php |
/api/data?id=456 | /api/data | |
/search?q=attack%20string | /search |
为什么在 WAF 中这个区别至关重要?
- 精确匹配 vs. 范围匹配:
- 使用 URI Path 规则可以拦截访问某个特定路径(如后台管理页面
/admin/
、敏感 API 端点/api/internal/
)的所有请求,无论它们带有什么参数。这用于保护特定区域。 - 使用 URI 规则可以更精确地拦截带有特定参数的请求。例如:
- 拦截尝试进行 SQL 注入的请求:
/products/view?id=1' OR '1'='1
(需要匹配查询字符串中的恶意负载)。 - 拦截尝试访问特定敏感资源的请求:
/download?file=../../etc/passwd
(路径遍历攻击依赖于参数值)。 - 拦截带有特定令牌或标识符的请求。
- 拦截尝试进行 SQL 注入的请求:
- 使用 URI Path 规则可以拦截访问某个特定路径(如后台管理页面
- 避免误拦截:
- 如果只想阻止访问
/admin/
目录下的所有内容,使用 URI Path/admin/*
是正确且安全的,不会影响类似/user/profile?section=admin
这样的合法请求(该请求的 Path 是/user/profile
)。 - 如果错误地使用 URI 规则去匹配路径,并设置规则为包含
admin
,那么/user/profile?section=admin
也会被错误拦截,因为它整个 URI 字符串包含了admin
。
- 如果只想阻止访问
- 性能与效率:
- 匹配 URI Path 通常更快,因为字符串更短且不包含多变的查询参数。
- 匹配完整的 URI(包含 Query String)可能需要处理更长、变化更大的字符串。
实际配置建议:
- 明确目标: 首先要清楚你想拦截什么。
- 是想拦截某个特定位置的所有访问? -> 用 URI Path。
- 是想拦截带有特定恶意参数的请求? -> 用 URI (并确保规则能检查 Query String)。
- 查看产品文档: 不同 WAF 厂商对配置项的具体命名和行为可能略有差异。务必查阅你所使用的 WAF 文档,确认其“URI”和“Path”字段具体匹配的是哪一部分。
- 利用通配符: 两者通常都支持通配符 (
*
,?
) 或正则表达式来实现模式匹配(如/admin/*
匹配/admin/
下所有路径,/search*.php
匹配各种 search 脚本)。 - 注意编码: WAF 在匹配之前通常会先对 URL 进行解码。攻击者可能对恶意负载进行编码(如
%20
代替空格,%27
代替单引号)。好的 WAF 规则会处理这些编码变体。
简单记忆:
- URI Path = 你去哪里? (
/shop/cart
,/api/login
) - URI (完整) = 你去哪里 + 带了什么条件? (
/shop/cart?item=123&qty=5
,/api/login?username=foo&password=bar
)
正确理解并使用 URI 和 URI Path 的区别,是配置精准、高效且低误报的 WAF 防护规则的关键。