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

Should url be stored in encoded or decoded form?

本文关键字:存储 解码 编码 url      更新时间:2023-09-26

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

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

  2. 一个有效的URL应该是一个有效的URI,所以我们应该使用http://example.com/%E4%BD%A0%E5%A5%BD而不是http://example.com/你好当请求或把它们放在href(即使大多数浏览器可以处理后一种情况)。

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

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

当我尝试显示这样的url时,我的问题来了,因为它们是用户提交的,我需要在这些数据上运行xss过滤器。有些实现,例如xss-filters,似乎将encodeURI作为过滤器的一部分来运行,这意味着%将被双重编码。%E4 -> %25E4,在进程中破坏url。

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

首先,RFC 2396被RFC 3986淘汰。其次,,如果您的存储机制允许,您应该以解码形式存储您的uri。

选自第2.4节

在正常情况下,只有当字节在URI内时在生成URI的过程中,百分比编码是它的组成部分。

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

注意,https://url.spec.whatwg.org/#urls是定义url的东西。它取代了您提到的那些rfc。

。,你的前提是不正确的,特别是这一部分:

一个有效的URL应该是一个有效的URI,所以我们应该使用http://example.com/%E4%BD%A0%E5%A5%BD而不是http://example.com/你好当请求或把它们放在href(尽管大多数浏览器可以处理后一种情况)。

你为什么这么说?http://example.com/你好是一个完全有效的URL