授权策略规范化
此页面描述了授权策略中支持的所有规范化。规范化的请求将用于授权策略的评估和最终发送到后端服务器的请求。
有关更多信息,请参阅 授权规范化最佳实践。
与路径相关的
这适用于 paths
字段 和 notPaths
字段。
1. 单个百分号编码字符 (%HH)
Istio 将按如下方式规范化单个百分号编码字符(规范化只执行一次,不会进行二次解码)
百分号编码字符(不区分大小写) | 规范化结果 | 注意 | 启用 |
---|---|---|---|
%00 | N/A | 请求将始终被 HTTP 代码 400 拒绝 | N/A |
%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 拒绝请求。
默认情况下启用。