有趣的编码

编码的由来

计算机原本是用来处理数学问题的,只认识0和1。后来,人们觉得计算机可以干更多的事,如处理文本。但计算机不认识除了0和1以为的东西,所以人们就用0和1的组合代表各种字符和符号。这种对应的字节字符关系即编码。

常见的几种编码

ASCII
诞生在美国,八位字节共256种搭配。0至31号定义了各种用途,然后剩下的用来编码空格,标点,数字和大小写字母直到127号。这里共用到7位二进制,剩下的最高位一般置0。

GB2312
随着其他国家也跟着使用计算机,ASCII码不能显示他们相应的字符,所以很多国家开始扩展128号至255号的编码用来保存他们的文字。等到中国也需要使用编码来保存自己的文字时,其余编码已经被扩展完了,但我们重新设定了:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA1到0xFE,这样就可以组合出大约7000多个简体汉字了。

GBK
不再要求低字节一定是127号之后的内码,只要第一个字节是大于127就固定表示这是一个汉字的开始。GBK包括了GB2312 的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。

UNICODE
ISO 的组织创造了一种编码 UNICODE ,这种编码非常大,大到可以容纳世界上任何一个文字和标志。所以只要电脑上有 UNICODE 这种编码系统,无论是全球哪种文字,只需要保存文件的时候,保存成 UNICODE 编码就可以被其他电脑正常解释。
UNICODE 在网络传输中,出现了两个标准 UTF-8 和 UTF-16,分别每次传输 8个位和 16个位。由于Unicode编码在编码某些汉字时会出现2个字节或3个字节的情况,所以utf8会给每个字符对应的二进制码前加上一个标记,让计算机看到这个标记就知道它将要读取几个字节。

URL编码
符号编码存在于ASCII码中的,被编码成(%+该字符的16进制)的形式。对于ASCII码中没有的字符,转换成utf-8字节序,每个字节转换成16进制再添加%。
防止服务器处理产生歧义,需要对特殊字符进行编码处理。URL中只允许包含英文字母(a-zA-Z)、数字(0-9)、- _ . ~4个特殊字符以及所有的保留字符。

网络世界里的编码

网络世界的交互依然是用0和1组成的字节序表示一系列信息,其中也包括文本信息。传递值时编码,接收值时解码。

但传递的是一串0和1,接收端要怎么才能正确解析呢。有时网页上展示的乱码,可能就是计算机进行了错误的解码。这些在网页间展示的信息,一般只需在HTML中的<head>标签中声明编码格式。
<meta charset="utf-8"> #其中的utf-8替换为其他编码即可
默认为 iso-8859-1 编码

而与服务器交互最多的URI资源,则使用URL编码。如URI中可能出现的空格和单引号,会在交互过程中自动转换为 %a0 和 %27。但细心点就会发现,参数中的字符串如index.php是不会发生编码的,会自动编码的是符号。

如果访问的路径带有中文,如
www.test.com/你好
抓包可以看见中文被编码了:
/%E4%BD%A0%E5%A5%BD #utf8

但如果是以参数形式访问的
www.test.com?page=你好
继续抓包:
/?page=%E4%BD%A0%E5%A5%BD #utf8

如果是网页内查询,则采用系统默认编码。

数据体
表单提交时,通常浏览器会根据ContentType指定的charset对表单中的数据编码,然后发送给服务器。

浏览器与服务器之间的编码解码

浏览器会把各种编码解码后展示给我们看,最简单的,可以在浏览器中的地址栏复制一条带中文或其他特殊字符的URL,黏贴到本地就会发现其中会出现很多%编码

浏览器会自动编码解码,但如果我们多走一步,先对特殊字符进行编码,再传入浏览器进行交互,这样的数据会绕过网页基于浏览器的验证过滤或服务器第一层验证,且不影响数据正常使用。
有些网站会对数据先编码一次再处理敏感字,这时可以尝试多次编码进行绕过。

浏览器本身的编码解码机制(资料总结)

  • 当浏览器发送http请求时,会先对特殊字符进行URL编码后,发送给服务器。
  • 服务器收到客户端发送来的http请求,会对其进行URL解码后,再进行处理,处理完成后将结果返回给浏览器。
  • 浏览器接收到html文件后,最先是触发html解析器来解析html,将标签转化为内容树中的DOM节点,此时在识别标签的时候,html解析器是不能识别哪些被html实体编码了,只有当整个DOM树建立起来后,才能对每个节点的内容进行识别,如果有html实体编码,再对其进行解码。
  • 在html解析器过程中,遇到js标签诸如<script>会调用js解释器对js代码进行解析,而js DOM API会对DOM结构进行更改,DOM树节点的更改也会反过来触发html解释器。
  • CSS解释器也会在html解释器过程中参与进来,但它不会干扰到DOM树,它会结合<style>标签和CSS文件以及html指令来构建render tree。

xss编码触发原理

当浏览器在处理诸如<script> <style>标签,解释器会自动切换到特殊解析模式,src href后边加入的javascript为URL,也会进入到JS解析模式。而进入该解析模式的时候,该DOM节点已经建立起来了,但是html解释器还并未进行html解码。当触发js解释器后,js会先对内容进行解析,如果有js编码就会进行解码操作,接下来是就是执行里面的js语句。所以此时执行该js语言前的解码顺序为js解码–>html解码。

参考资料(侵删)

https://www.cnblogs.com/flycat-2016/p/6507543.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据