url 应该以编码形式存储还是以解码形式存储?

bit*_*inn 5 javascript url encoding mongodb node.js

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

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

  2. \n
  3. 有效的 URL 应该是有效的 URI,因此我们应该在发出请求或放入它们时使用http://example.com/%E4%BD%A0%E5%A5%BD而不是(尽管大多数浏览器可以处理后一种情况)。http://example.com/\xe4\xbd\xa0\xe5\xa5\xbdhref

  4. \n
  5. 此外,我们接受用户提交的 URL,这些 URL 也经过编码(因为当您从地址栏复制 URL 时,浏览器会对它们进行编码)。

  6. \n
  7. 因此我们决定(可能是一个错误)将它们存储为http://example.com/%E4%BD%A0%E5%A5%BD,而不是http://example.com/\xe4\xbd\xa0\xe5\xa5\xbd,毕竟,这是原始输入和正确的 url。

  8. \n
\n\n

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

\n\n

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

\n

Fre*_*ald 2

首先,RFC 2396 被RFC 3986取代。其次,是的,如果您的存储机制允许,您应该以解码的形式存储您的 URI。

2.4更新

在正常情况下,URI 中的八位字节仅在从其组成部分生成 URI 的过程中进行百分比编码。

更新 2 此外,表示 URI 的 unicode 字符串实际上是 IRI。参见RFC 3987