IIS 8.5 - 请求包含波浪号 ('~') 时的 404 响应

问题描述

我向我的 .net 核心 Web API 发送请求时遇到问题。

该请求包含一个路径变量,带有波浪号 ('~') 后跟一个数字。例如:

GET 'https://example.com/v1/Books/details/~0~~9600131~BookTitle'

错误是带有消息的 404

您要查找的资源已被删除、更名或暂时不可用。

奇怪的是,这个请求在我们的测试环境中有效。此环境与我们的生产环境几乎相同。

是否有任何我可以检查的 IIS 设置可以解释这些差异?

编辑:问题似乎与 ~{Numeric Character} 有关。

~2 不起作用但是

~~~g 有效

IIS 8.5

解决方法

不安全:

由于多种原因,字符可能不安全。空间
字符是不安全的,因为重要的空格可能会消失并且
转录网址时可能会引入无关紧要的空格或
排版或经受文字处理程序的处理。
字符“”是不安全的,因为它们被用作
自由文本中 URL 周围的分隔符;引号 (""") 用于
在某些系统中分隔 URL。字符“#”是不安全的,应该 总是被编码,因为它用于万维网和其他
将 URL 与片段/锚标识符分隔开的系统 跟着它。字符“%”是不安全的,因为它用于
其他字符的编码。其他字符是不安全的,因为
网关和其他传输代理有时会修改
这样的字符。这些字符是“{”、“}”、“|”、“”、“^”、“~”
“[”、“]”和“`”。

所有不安全的字符都必须始终在 URL 中进行编码。对于
例如,字符“#”必须在 URL 中编码,即使在
通常不处理片段或锚点的系统
标识符,以便如果 URL 被复制到另一个系统中
使用它们,不需要更改 URL 编码。

因为波浪号 ('~') 不安全,IIS 在核心级别主动阻止这种行为。这是一种主动安全措施,可以最大限度地减少攻击面。

您可以参考此 link 以了解有关引用段落的更多信息。