url应该以编码或解码的形式存储吗?

时间:2015-05-29 10:09:45

标签: javascript node.js mongodb url encoding

我的问题有点奇怪,但让我解释一下:

  1. 假设有效URI不允许每个RFC-2396使用unicode,URI中的所有unicode都应使用百分比编码进行转义。

  2. 有效的网址应该是有效的URI,因此我们在提出请求或将其放入http://example.com/%E4%BD%A0%E5%A5%BD时应使用http://example.com/你好而不是href(即使大多数浏览器都可以处理后一种情况)。

  3. 此外,我们接受用户提交的网址,这些网址也会被编码(因为浏览器会在您从地址栏复制网址时对其进行编码)。

  4. 所以我们决定(可能是一个错误)将它们存储为http://example.com/%E4%BD%A0%E5%A5%BD,而不是http://example.com/你好,这是原始输入和正确的网址。

  5. 我的问题出现在我尝试显示此类网址时,鉴于用户提交了这些网址,我需要对这些数据运行xss过滤器。某些实现(例如xss-filters)似乎作为过滤器的一部分运行encodeURI,这意味着%将被双重编码,例如。 %E4 - > %25E4,在此过程中破坏了网址。

    那么我们应该以解码的形式存储url(即使它们无效)?在输出上运行decodeURI对我来说没有多大意义......

2 个答案:

答案 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/你好是完全有效的网址。