您的位置:首页 > 理论基础 > 计算机网络

【网络基础】为什么要对url进行encode呢?

2016-08-21 17:57 316 查看

URL编码背景

在URI的最初设计时,希望能通过书面转录,比如写在餐巾纸上告诉另外一人,因此URI的构成字符必须是可写的ASCII字符。在这些可书写的字符里,由于一些字符在不同操作系统的编码有不同的解析,被包含在“不安全字符”之中,要格外注意。

(不安全字符)



在URI的构成字符中,最安全的方案是正确使用“保留字符” 和 “非保留字符”的并集

保留字符: 在URL中起到职能型的字符,比如 & ,? 。所以被URL规则给“保留”了。

(保留字和非保留字)



重点:percent encode

何谓percent encode呢?意指百分号编码,借助%来进行有效编码。URL encode的实质就是正确的使用percent encode.

percent encode = % 十六进制


什么时候,对哪些内容,采用何种过滤原则,以及如何生成percent编码?

  在WWW最初时,做法是将字符流转换成字节流,按照ASCII字符与字节一一对应可相互转换,使用对应ASCII字符的整型值作为%的后两个16进制字符,构成percent编码。后来出现了多种percent编码生成方法,导致了URI的难以识别。

  目前做法,指定或系统默认的使用UTF8转成字节流,每个字节编成一个percent编码,例如:中文“网易”的URL编码为%e7%bd%91%e6%98%93,而其UTF8字节流为e7 bd 91 e6 93,可以看出其一一对应关系

  那么percent编码是在对非法字符采用某种编码(约定为UTF8)转成字节流后,逐字节加上%构成percent编码。

  由于不同scheme或协议对URI格式有不同的要求,RFC关于对哪些内容编码,采用何种过滤原则不做硬性规定。而将决定权延后到执行时由开发者根据需要决定。

重点:URL编码需要遵守的原则:

不要对Unreserved Characters做percent encode编码。

除了保留字符和非保留字符外的所有字符,必须使用percent encode进行编码。

保留字符不用于URI分隔符,而是用于其它位置,比如query部分的value时,要对这时用到的保留字符做percent encode编码。



不应当对”保留字”在作为”保留字的使用场景”时使用percent encode编码。比如“http://gulfstream.ptmobile.dev.sankuai.com/schedule?project=AIMT”中的?此时就是作为保留字来使用的,不应当被percent encode。当两个URI的字符几乎对等,区别只在于一个对某些字符用的原有字符,另一个URI对这些字符做了percent encode时。绝大部分情况下,这两个URI应当被认为是不同的两个URI。

不正确的URL encode可能导致的问题

禁止对URI中的保留字作编码,比如&字符。

比如http://www.baidu.com做编码后变成了http%3a%2f%2fwww.baidu.com%2findex.htm,将不能正常访问。

如果url参数值带有保留字符,encode之。

当构建参数传入{“name” : ”namepart1&namepart2”,“id” : “kk”}。

此时拼接字符串编成了http://www.baidu.com?name=namepart1&namepart2&id=kk,那么如何解析得到”name”字段“namepart1&namepart2”的实际value值,以及id字段的值”kk”?

潜在的语义攻击风险

当构建参数传入{“name” : ”Mitty&isLogin=true”}。此时拼接字符串编成了http://www.baidu.com?name=Mitty&isLogin=true,如果isLogin真的是有意义的queryKey时,直接造成服务器接收了额外的参数。当然关于URL的攻击有很多,比如semantic attack, 这里不做讨论。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: