我的问题有点奇怪,但让我解释一下:
假设有效URI不允许每个RFC-2396使用unicode,URI中的所有unicode都应使用百分比编码进行转义。
有效的网址应该是有效的URI,因此我们在提出请求或将其放入http://example.com/%E4%BD%A0%E5%A5%BD
时应使用http://example.com/你好
而不是href
(即使大多数浏览器都可以处理后一种情况)。
此外,我们接受用户提交的网址,这些网址也会被编码(因为浏览器会在您从地址栏复制网址时对其进行编码)。
所以我们决定(可能是一个错误)将它们存储为http://example.com/%E4%BD%A0%E5%A5%BD
,而不是http://example.com/你好
,这是原始输入和正确的网址。
我的问题出现在我尝试显示此类网址时,鉴于用户提交了这些网址,我需要对这些数据运行xss过滤器。某些实现(例如xss-filters)似乎作为过滤器的一部分运行encodeURI,这意味着%
将被双重编码,例如。 %E4
- > %25E4
,在此过程中破坏了网址。
那么我们应该以解码的形式存储url(即使它们无效)?在输出上运行decodeURI
对我来说没有多大意义......
答案 0 :(得分:2)
首先,{23}已废弃RFC 2396。其次,是,如果您的存储机制允许,您应该以解码的形式存储您的URI。
<强>更新强> 来自RFC 3986
正常情况下,URI中的八位字节的唯一时间 百分比编码是在生成URI的过程中 它的组成部分。
更新2 此外,表示URI的一串unicode字符实际上是IRI。见Section 2.4
答案 1 :(得分:1)
请注意,https://url.spec.whatwg.org/#urls是定义网址的内容。它取代了你提到的那些RFC。
即,您的前提是不正确的,特别是本节:
有效的网址应该是有效的URI,因此在提出请求或将其置于href时我们应该使用
http://example.com/%E4%BD%A0%E5%A5%BD
而不是http://example.com/你好
(即使大多数浏览器都可以处理后一种情况)。
是什么让你这么说的? http://example.com/你好
是完全有效的网址。