网站地图    收藏   

主页 > 后端 > 网站安全 >

GBK字符编码(字符集)缺陷导致web安全漏洞 - 网

来源:自学PHP网    时间:2015-04-17 10:16 作者: 阅读:

[导读] 很多时候,字符编码使用,我们不会太过在意的。象中文网站,我们一般用gb2312,gbk,gb18030,也可以用utf-8。但是,可能我们不知道,选择不同编码,可能因此导致程序本身设计缺陷。多字...

很多时候,字符编码使用,我们不会太过在意的。象中文网站,我们一般用gb2312,gbk,gb18030,也可以用utf-8。但是,可能我们不知道,选择不同编码,可能因此导致程序本身设计缺陷。
 
多字节编码由来
 
我们先来看看最常用的,最小字符集是ascii,对应的二级制描述是00-7F 。也是我们计算机使用最早通用的字符集。前期几乎可以表示所有所有英文字符。后来,我们发现想用此表示中文字符。发现远远不够了。常见中文就有7000多个字符。ascii码就只有128字符,只有0-127编码位置。因此,我们想法就是,怎么样做更大字符集,并且保证兼容ascii编码。要支持更多字符,选择更大字符集。我们只能用多个字节来描述一个字符了。一般做法是:每个字节值都大于>7F,如果是多个字节,那么就是:[>7F][>7F]。 这样编码,保证很好的与ascii区分开,有扩大了字符集。想gb2312范围在[0xA1-0xF7][0xA1-0xFE](中间很多没有填满),它完全保证所有字节在A0之上,也就完全满足在7F之上了。
 
GBK编码漏洞缘由
 
通过上面的分析,我们知道gb2312编码是很好的跟ascii码分开了。 那么我们看看,GBK编码呢,它是完全兼容gb2312(就是说在gb2312字符集中每个字符位置,与gbk字符集里面位置完全一致,而且包含于gb2312),但是,它有2万多个字符。从上面看,只能选择往下排序了。 就是从A1A0往下排了,我们发现它编码实际范围是:[0x81-0xFE]([0x40-0x7E|0x80-0xFE] ),我们发现由2个字节组成,首字节范围在7F之上,而第2个字节,有一部分在0×40-0x7E了。这就是导致bug原因。我们看看下面例子吧!
 
从ASCII码表中,我们知道包含字符有:“ A-Za-z@[\ ]^_`{|}~”,一共有63字符呢。
 
GBK编码漏洞选择gbk编码,运行上面代码,就一条简单的命令导致出现错误,说字符串 赋值 没有结束! 呵呵,估计很多人看到这个就会认为是php 出Bug了。但是,如果我们变成$a=”誠a”,发现可以正常运行了。是不是觉得很奇葩啦!!
 
 
原因分析:我们知道文件存在磁盘都是二级制方式,无论你存什么字符,最终都是以该字符的在所选字符集中字符编码保存。php解析时候,最新分析单元是字节。无论你是多字节,单字节字符。最终都是按照字节来处理的。 “誠”  GBK编码是 D55C,php按字节来解释,5C对应字符是“\” 字符。后面直接跟个‘”’,相当于被转义了。 因为没有闭合,因此出现错误! 。 大家看出问题所在了吧,按自己处理的话,会自然把多字节拆成单字节了。这样就会出现很多奇怪问题了。
 
总结:分析了多字节编码过程,以及产生漏洞原因。其实,我们很多程序语言里面,都会以单个字节来解析的。这样,当你多字节中文中,刚好有字节落在特殊位置,将会出现奇怪的问题。而且,还将给系统带来本身的漏洞,后面我再说说,GBK编码缺陷,导致漏洞的实例吧!欢迎交流!
 

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论