在 Web 應(yīng)用防火墻 (WAF) 的攔截設(shè)置中,URI (Uniform Resource Identifier) 和 URI Path 是兩個(gè)密切相關(guān)但有重要區(qū)別的概念,理解它們對(duì)于精確配置規(guī)則至關(guān)重要:
- URI (Uniform Resource Identifier)
- 定義: 這是標(biāo)識(shí)網(wǎng)絡(luò)資源的完整字符串。它包含了訪問該資源所需的所有組成部分。
- 組成: 一個(gè)完整的 URI 通常包括:
- Scheme:
http://
,https://
,ftp://
等。 - Host: 域名或 IP 地址 (例如
www.example.com
,192.168.1.1
)。 - Port: (可選,如果使用標(biāo)準(zhǔn)端口如 80 或 443 則通常省略) 例如
:8080
。 - Path: 資源在服務(wù)器上的具體路徑 (例如
/products/index.html
,/api/v1/users
)。 - Query String: (可選) 以
?
開頭,包含傳遞給資源的參數(shù) (例如?id=123&category=books
)。 - Fragment: (可選) 以
#
開頭,通常用于指定資源內(nèi)部的某個(gè)錨點(diǎn) (例如#section2
),注意:Fragment 通常不會(huì)被發(fā)送到服務(wù)器。
- Scheme:
- WAF 中的含義: 當(dāng) WAF 規(guī)則指定匹配 URI 時(shí),它通常指的是包含 Path + Query String 的部分(有時(shí)也可能包括 Port,但 Scheme 和 Host 通常在更早的 HTTP 頭部處理階段被處理或用于路由,而不直接作為 URI 規(guī)則匹配的一部分)。最重要的是它包含了查詢參數(shù) (
?
后面的部分)。 - 示例:
https://www.example.com:8080/products/search?q=shoes&sort=price#results
這個(gè) URI 中,WAF 規(guī)則匹配的 URI 部分通常是/products/search?q=shoes&sort=price
(Path + Query String)。
- URI Path
- 定義: 這是 URI 中特定于資源位置的部分,它標(biāo)識(shí)了目標(biāo)資源在服務(wù)器上的路徑或端點(diǎn)。
- 組成: 僅包含從域名/IP地址之后的第一個(gè)
/
開始,到?
(查詢字符串開始) 或#
(片段開始) 或字符串結(jié)束為止的部分。它不包含 Scheme, Host, Port, Query String 或 Fragment。 - WAF 中的含義: 當(dāng) WAF 規(guī)則指定匹配 URI Path 時(shí),它只關(guān)注資源的路徑部分,完全忽略查詢字符串 (
?
后面的所有內(nèi)容)。 - 示例: 對(duì)于同一個(gè) URI
https://www.example.com:8080/products/search?q=shoes&sort=price#results
,WAF 規(guī)則匹配的 URI Path 部分只是/products/search
。
核心區(qū)別總結(jié):
特性 | URI (在 WAF 上下文中) | URI Path |
---|---|---|
包含內(nèi)容 | Path + Query String (可能包含 Port) | 僅 Path |
是否包含查詢參數(shù) (? 后) | 是 | 否 |
用途 | 匹配包含特定參數(shù)的特定資源請(qǐng)求 | 匹配特定位置或端點(diǎn)的所有請(qǐng)求 |
示例 (基于請(qǐng)求) | /login.php?username=admin | /login.php |
/api/data?id=456 | /api/data | |
/search?q=attack%20string | /search |
為什么在 WAF 中這個(gè)區(qū)別至關(guān)重要?
- 精確匹配 vs. 范圍匹配:
- 使用 URI Path 規(guī)則可以攔截訪問某個(gè)特定路徑(如后臺(tái)管理頁面
/admin/
、敏感 API 端點(diǎn)/api/internal/
)的所有請(qǐng)求,無論它們帶有什么參數(shù)。這用于保護(hù)特定區(qū)域。 - 使用 URI 規(guī)則可以更精確地?cái)r截帶有特定參數(shù)的請(qǐng)求。例如:
- 攔截嘗試進(jìn)行 SQL 注入的請(qǐng)求:
/products/view?id=1' OR '1'='1
(需要匹配查詢字符串中的惡意負(fù)載)。 - 攔截嘗試訪問特定敏感資源的請(qǐng)求:
/download?file=../../etc/passwd
(路徑遍歷攻擊依賴于參數(shù)值)。 - 攔截帶有特定令牌或標(biāo)識(shí)符的請(qǐng)求。
- 攔截嘗試進(jìn)行 SQL 注入的請(qǐng)求:
- 使用 URI Path 規(guī)則可以攔截訪問某個(gè)特定路徑(如后臺(tái)管理頁面
- 避免誤攔截:
- 如果只想阻止訪問
/admin/
目錄下的所有內(nèi)容,使用 URI Path/admin/*
是正確且安全的,不會(huì)影響類似/user/profile?section=admin
這樣的合法請(qǐng)求(該請(qǐng)求的 Path 是/user/profile
)。 - 如果錯(cuò)誤地使用 URI 規(guī)則去匹配路徑,并設(shè)置規(guī)則為包含
admin
,那么/user/profile?section=admin
也會(huì)被錯(cuò)誤攔截,因?yàn)樗麄€(gè) URI 字符串包含了admin
。
- 如果只想阻止訪問
- 性能與效率:
- 匹配 URI Path 通常更快,因?yàn)樽址糖也话嘧兊牟樵儏?shù)。
- 匹配完整的 URI(包含 Query String)可能需要處理更長、變化更大的字符串。
實(shí)際配置建議:
- 明確目標(biāo): 首先要清楚你想攔截什么。
- 是想攔截某個(gè)特定位置的所有訪問? -> 用 URI Path。
- 是想攔截帶有特定惡意參數(shù)的請(qǐng)求? -> 用 URI (并確保規(guī)則能檢查 Query String)。
- 查看產(chǎn)品文檔: 不同 WAF 廠商對(duì)配置項(xiàng)的具體命名和行為可能略有差異。務(wù)必查閱你所使用的 WAF 文檔,確認(rèn)其“URI”和“Path”字段具體匹配的是哪一部分。
- 利用通配符: 兩者通常都支持通配符 (
*
,?
) 或正則表達(dá)式來實(shí)現(xiàn)模式匹配(如/admin/*
匹配/admin/
下所有路徑,/search*.php
匹配各種 search 腳本)。 - 注意編碼: WAF 在匹配之前通常會(huì)先對(duì) URL 進(jìn)行解碼。攻擊者可能對(duì)惡意負(fù)載進(jìn)行編碼(如
%20
代替空格,%27
代替單引號(hào))。好的 WAF 規(guī)則會(huì)處理這些編碼變體。
簡(jiǎn)單記憶:
- URI Path = 你去哪里? (
/shop/cart
,/api/login
) - URI (完整) = 你去哪里 + 帶了什么條件? (
/shop/cart?item=123&qty=5
,/api/login?username=foo&password=bar
)
正確理解并使用 URI 和 URI Path 的區(qū)別,是配置精準(zhǔn)、高效且低誤報(bào)的 WAF 防護(hù)規(guī)則的關(guān)鍵。