授權政策正規化
此頁面描述授權原則中所有支援的正規化。正規化後的請求將用於評估授權原則以及最終發送到後端伺服器的請求。
更多資訊,請參考授權正規化最佳實務。
路徑相關
這適用於paths
欄位和notPaths
欄位。
1. 單一百分比編碼字元 (%HH)
Istio 將單個百分比編碼的字元正規化如下(正規化只發生一次,不會進行雙重解碼)
百分比編碼字元(不區分大小寫) | 正規化結果 | 注意事項 | 啟用 |
---|---|---|---|
%00 | 不適用 | 請求將永遠被拒絕,並返回 HTTP 代碼 400 | 不適用 |
%2d | - | (破折號) | 預設使用正規化選項 BASE 啟用 |
%2e | . | (點) | 預設使用正規化選項 BASE 啟用 |
%2f | / | (正斜線) | 預設停用,可以使用正規化選項 DECODE_AND_MERGE_SLASHES 啟用 |
%30 - %39 | 0 - 9 | (數字) | 預設使用正規化選項 BASE 啟用 |
%41 - %5a | A - Z | (大寫字母) | 預設使用正規化選項 BASE 啟用 |
%5c | \ | (反斜線) | 預設停用,可以使用正規化選項 DECODE_AND_MERGE_SLASHES 啟用 |
%5f | _ | (底線) | 預設使用正規化選項 BASE 啟用 |
%61 - %7a | a - z | (小寫字母) | 預設使用正規化選項 BASE 啟用 |
%7e | ~ | (波浪號) | 預設使用正規化選項 BASE 啟用 |
例如,路徑為 /some%2fdata/%61%62%63
的請求將被正規化為 /some/data/abc
。
2. 反斜線 (\
)
Istio 會將反斜線 \
正規化為正斜線 /
。例如,路徑為 /some\data
的請求將被正規化為 /some/data
。
此功能預設使用正規化選項 BASE
啟用。
3. 多個正斜線 (//
, ///
等)
Istio 會將多個正斜線合併為單個正斜線 (/
)。例如,路徑為 /some//data///abc
的請求將被正規化為 /some/data/abc
。
此功能預設停用,但可以使用正規化選項 MERGE_SLASHES
啟用。如果啟用,該路徑可能無法與具有路徑範本運算子 {**}
的路徑匹配。例如,一旦啟用 MERGE_SLASHES
,/some/data//abc
將不再匹配 /some/data/{**}/abc
,因為該路徑將被正規化為 /some/data/abc
。
4. 單點和雙點 (/./
, /../
)
Istio 將根據 RFC 3986 解析單點 /./
和雙點 /../
。單點將被解析為當前目錄,雙點將被解析為父目錄。
例如,/public/./data/abc/../xyz
將被正規化為 /public/data/xyz
。
此功能預設使用正規化選項 BASE
啟用。
5. 帶有查詢的路徑 (/foo?v=1
)
Istio 授權原則在與路徑比較時,會移除問號 (?
) 之後的所有內容。請注意,後端應用程式仍會看到查詢。
此功能預設啟用。
方法相關
這適用於 methods
和 notMethods
欄位。
1. 方法不是大寫
如果 HTTP 請求中的動詞不是大寫,Istio 將拒絕請求並返回 HTTP 400 錯誤。
此功能預設啟用。
標頭名稱相關
這適用於 request.headers[<header-name>]
條件中指定的標頭名稱。
1. 不區分大小寫比對
Istio 授權原則將以不區分大小寫的方式比較標頭名稱。
此功能預設啟用。
2. 重複標頭
Istio 會將重複的標頭合併為單個標頭,並使用逗號作為分隔符號連接所有值。
授權原則將對合併後的標頭進行簡單的字串比對。例如,標頭為 x-header: foo
和 x-header: bar
的請求將合併為 x-header: foo,bar
。
此功能預設啟用。
3. 標頭名稱中的空白
如果標頭名稱包含任何空格,Istio 將拒絕請求並返回 HTTP 400 錯誤。
此功能預設啟用。