编码的由来
计算机原本是用来处理数学问题的,只认识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解码。
I love what you guys tend to be up too. This
kind of clever work and coverage! Keep up the awesome works
guys I’ve included you guys to my own blogroll.
Everything is very open with a precise description of the challenges.
It was definitely informative. Your site is extremely helpful.
Many thanks for sharing!
Aw, this was a really good post. Taking a few minutes and actual effort to
create a top notch article… but what can I
say… I hesitate a whole lot and don’t manage to get nearly anything
done.
I am regular visitor, how are you everybody? This piece of writing posted at this website is
actually good.
I go to see day-to-day some websites and information sites to read
articles or reviews, except this webpage offers quality based posts.
What’s up, of course this piece of writing is really nice and
I have learned lot of things from it concerning
blogging. thanks.