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

来源:互联网 发布:java executor 线程池 编辑:程序博客网 时间:2024/06/05 10:57

URL编码背景

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

(不安全字符)

这里写图片描述

在URI的构成字符中,最安全的方案是正确使用“保留字符” 和 “非保留字符”的并集 
保留字符: 在URL中起到职能型的字符,比如 & ,? 。所以被URL规则给“保留”了。

(保留字和非保留字)

这里写图片描述

重点:percent encode

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

percent encode% 十六进制
  • 1
  • 1

什么时候,对哪些内容,采用何种过滤原则,以及如何生成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, 这里不做讨论。
0 0
原创粉丝点击