Quoted-printable 编码介绍、编码解码转换

Quoted-printable 可译为“可打印字符引用编码”、“使用可打印字符的编码”,我们收邮件,查看信件原始信息,经常会看到这种类型的编码!

Quoted-printable编码
最多时候,我们在邮件头里面能够看到这样的编码!Content-Transfer-Encoding:quoted-printable
 

它是多用途互联网邮件扩展(MIME) 一种实现方式。其中MIME是一个互联网标准,它扩展了电子邮件标准,致力于使其能够支持非ASCII字符、二进制格式附件等多种格式的邮件消息。目前http协议中,很多采用MIME框架!quoted-printable 就是说用一些可打印常用字符,表示一个字节(8位)中所有非打印字符方法!

Quoted-printable编码方法

任何一个8位的字节值可编码为3个字符:一个等号”=”后跟随两个十六进制数字(0–9或A–F)表示该字节的数值.例如,ASCII码换页符(十进制值为12)可以表示为”=0C”, 等号”=”(十进制值为61)必须表示为”=3D”. 除了可打印ASCII字符与换行符以外,所有字符必须表示为这种格式.

所有可打印ASCII字符(十进制值的范围为33到126)可用ASCII字符编码来直接表示, 但是等号”=”(十进制值为61)不可以这样直接表示.ASCII的水平制表符(tab)与空格符, 十进制为9和32, 如果不出现在行尾则可以用其ASCII字符编码直接表示。如果这两个字符出现在行尾,必须QP编码表示为”=09″ (tab)或”=20″ (space).

如果数据中包含有意义的行结束标志,必须转换为ASCII回车(CR)换行(LF)序列,既不能用原来的ASCII字符也不能用QP编码的”=”转义字符序列。 相反,如果字节值13与10有其它的不是行结束的含义,它们必须QP编码为=0D与=0A.

quoted-printable编码的数据的每行长度不能超过76个字符. 为满足此要求又不改变被编码文本,在QP编码结果的每行末尾加上软换行(soft line break). 即在每行末尾加上一个”=”, 但并不会出现在解码得到的文本中.

例如:If you believe that truth=beauty, then surely mathematics is the most beautiful branch of philosophy. 编码后结果是

If you believe that truth=3Dbeauty, then surely=20=
mathematics is the most beautiful branch of philosophy.

编码里面,有几个特定限定,一些可打印字符不用编码,当然如果你按照规范编码后,也一样可以显示的!因此自己简单自己实现该编码:

function quoted_printable_encode($string) { 
    return preg_replace('/[^\r\n]{73}[^=\r\n]{2}/', "$0=\r\n", str_replace("%","=",
rawurlencode($string)));
}

一个函数就可以,将所有字符串urlencode转换后,%号替换为”=”号,然后对非\r\n超过73连续字符,后面加一个=\r\n。这个是简单实现方法! 按照该编码详细说明里面,有些空格、换行,还有一些特殊字符可以不用转换。不过一起转换了,也不会有影响!

很多时候,我们用些常见字符表示所有8位其它非打印字符,这种通过,Quoted-printable编码,只是对该字节转为16进制后,做简单增加前缀!然后做些特殊字符处理即可! 它的简单,及编码高效,也让该编码在邮件格式里面,得到了广泛使用!好了,就到这里,欢迎交流!

Posted in web原理 | Tagged , | Leave a comment

ISO-8859-1 、Latin-1 西欧编码介绍及应用

这些编码,早些时候在一些应用软件中经常看到,估计很多朋友也看到了,这些编码了!

iso-8859-1字符集应用 

从这个图,我们可以看到这类编码应用很广泛,那么我们一起看看,iso-8859-1字符集,到底是什么样字符集,有那些字符!为什么,它应用可以这么广泛!

计算机上面流行第一个字符集,是ascii码,是0-127 一个128字符。每个字符在里面有个对应编号,分别是0-127。如果用二进制表示,刚好是7位。这个字符集,在前期表示英文字符已经足够。后来,随着计算机普及,越来越多国家(欧洲),开始应用计算机,他们发现7位,共128字符。已经不能描述他们常用的字符了。因此想到要兼容ascii字符集,就指定了扩展ASCII字符集。最多是0-255,256个字符。其中0-127 128字符及位置编码 完全兼容ascii码。只是扩展了128-255位置编入了新字符!

iso-8859-1字符集 

该字符集,完全兼容ascii字符集,并且是刚好可以用一个字节表示里面所有字符位置。又称为扩展Ascii码!这也是第一个iso-8859-1字符集。又叫:Latin-1 编码(西欧编码),后来陆续出了iso-8859-2…-15字符集。都是完全兼容ascii码的。

 

说下几个概念吧,什么是字符集,什么是字符编码?

1、字符集,表示由一些指定的字符的所组成集合!ascii字符集,里面有128个字符

2、字符编码,每个字符集中字符,都有一个固定的编号,也叫该字符在字符集中的的编码!如:ascii字符集中,a 字符编码是97。

相同字符,会出现在多个字符集中吗,相同字符在不同字符集中编码一样吗?

从上面例子,我们可以看到,ascii字符集、iso-8859-1字符集 有128个字符相同的。经常相同的字符,可以出现在各个字符集中。但是,每个字符集对字符编号方式可能不同,因此,相同字符,在不同字符集中,编码结果可能不一样。当然,也有一样的!象ascii中所有字符编码,在iso-8859-1字符集中,都一样的。

 

弄清楚关于、字符集,字符编码概念。我们还有几个必须掌握的。就是,计算机是怎么样储存,显示字符的呢?

一个文件有很多符号组成,各式各样的!实际,计算机在存储时候,只是写入该字符所对应的字符编码值。将它存于磁盘或者在网络中传输!如果要显示时候,通过对应字符集中,字符编码值。然后可以转换到计算机 通用的字符集的对应字符编码。计算机每个字符形状,图像长相,都在字体中。然后,通过转换得到通用字符集的字符编码,找到对应的字符,及字体形状,然后显示出来!

字符存储方式 
字符在计算机存储、传输都是该字符所在字符集中编码值 
 

好了,中间我们对字符概念做了很多的阐述、说明!下面,我们继续本页主题iso-8859-1字符集了。 它为什么能够这么广泛应用呢?

我们知道,单字节最多可以表示256字符,实际上很多字符(目前unicode有几十万字符),都需要用多个字节来存储!计算机在存储传输都以字节为单位!因此单字节的: iso-8859-1 是存储的最小单元。所以,无论你是多少个字节组成的字符,以单字节一个一个存储、传输!都不会改变原来的值,都可以很好保存它的值!计算机乱码,出现在显示的时候,在不正确的字符集中,查找对应字符编码的字符!经常是,编码选择字符集,跟做显示选择字符集不一致造成的!

在复制文件、传输文件不会造成字符编码问题。而出现问题时候,是字符做显示,或者将显示字符存储的时候,会出现问题!好了,这里面说的是iso-8859-1 其实,更多的是说说,字符编码的一些常识!明白这些,对于iso-8859-1的一些特点理解,可能 更容易了!

可能以前有朋友就问,我mysql是存中文的,为什么我选择字符集是Latin-1 ,是不是就出现乱码了。其实不会,它只是将接到任何字节,按照单字节,逐个逐个存储的。然后,读取时候,也逐个逐个字节的读出。没有改变任何保存内容,也没有做任何编码转换!这是,最为安全的!好了,就到这里了,欢迎朋友们交流!

Posted in web原理 | Tagged , | Leave a comment

web应用安全参数检测方法(检测输入参数方法)

前面我们说到,web应用安全的基数是,做好参数检测!就像是小区防止小偷,必须把好所有进入门。然后,对进入人员进行检测!这些我们都清楚的,就是有时候在web应用中,对输入参数检测时候发现困难!因为,输入参数字符可以各种各样,长度也不相同!我们从什么维度准确标识出我所需要的格式呢?

这里我观点是,应用对参数检测可以分为2个关卡,第一个关卡可以是,保证参数输入安全。第二个关卡是保证它是业务所需要的值。一个应用,保证安全是最基础的。我们第一关检测参数,怎么样做比较好呢?

标识参数方法?

所有web传入都是字符串,我们怎么样标识字符串呢?字符串都是有字符组成的,常见是ascii码,对于中文网站,有gb2312,gbk等字符。从这里看,字符个数会很多。它们之间如果做长度不一组合字符串,将会更多了。 因此,再一次说明,不要用现在字符串方法,来检测!有可能你需要限制是无底洞!可以说,对于我们一个web应用参数,90%以上,基本在ascii码就可以,很少参数会突变到这100多个字符范围。所以,标识一个字符串,可以从以下2个方面来限制:

1、字符串 中字符范围 (如:如果是手机号0-9,用户名可能是字母+数字之类)

2、字符串 长度 (如手机号是:11位,用户名可能是:6-15位)

以上方法可以保证,不在用户需要字符范围的字符,一定不能进入后端!我们看看一般例子!

<?php
/**
*读取get值
*@copyright  http://blog.chacuo.net
*@author 8292669
*@param $k string get参数名称
*@param $p string 正则表达式内容
*@return string|array 读取值
*/
function input_get($k,$p='.*')
{
	$v = isset($_GET[$k])?$_GET[$k]:'';
	if(is_array($v))
	{
		$_v = array();
		foreach ($v as $k=>$_v1)
		{
			$_v[$k]=!preg_match("/^".$p."$/",$_v1)?'':$_v1;
		}
		return  $_v;
	}
	return !preg_match("/^".$p."$/",$v)?'':$v;
}

测试:var_dump(input_get(‘a’,'\d+’),input_get(‘b’,'\d+’));  读取a,b参数,都为数字的!

web应用安全参数检测方法 
因为参数b输入是:2ccc,因此不是0-9字符。所以返回为空字符串!

上面这样每次输入正则表达式确实很麻烦的,其实,一个应用,业务字段,应该都比较固定,我们可以再在该基础上面,进一步封装些,取独立业务字段函数。如:input_getUser($k) 专门读取用户名,input_getQQ($k)专门读取QQ号。如此类推,然后我们发现真的需要独立写检测的变得非常少了!

怎么样限制中文字符?

我有一个真实姓名框,需要输入真实姓名!我该怎么样检测?我们知道常见中文字符表是gb2312,其实中国人取名字现在都需要在常见汉字里面挑选。也就是在区位码表中找。所以,我们问题就变成了,怎么样检查用户输入是不是在gb2312字符集中。gb2312是多字节的,一个中文都是2个字节。只要我们先对好范围就可以了。 gb2312字符集表,我们可以查看:http://doc.chacuo.net/gb2312

gb2312字符集 

第一个字节范围是:A1-F7 第2个字节范围是A1-FE ,因此我们正则表达式可以写成:[\xA1-\xF7][\xA1-\xFE] 就可以对2个字节限制了。 “怎么拿过去用不了?”,这里我们做中文限制,只完成第一步,在指定字符集中,找好需要用到中文的字符编码。第二步,就是你要将原字符串转码为该字符集编码。如:你如果是utf-8编码,你需要将获取字符串先转码为gb2312,然后再用gb2312字符位置 正则表达式来检测! 如果,你不转码,你发现刚刚找的那个字符位置正则表达式毫无用处了!通过这个,我们注意做中文位置检测时注意:

1、选择好字符集,找好字符位置,准备好字符范围的正则表达式

2、将待检测字符串,转码为选号的字符集的编码

现在,我们知道了字符串检测方法了,无论简单参数、还是复杂中文字符参数!我们都可以轻松完成了!通过字符串中字符范围定位需要字符在实际检测中,非常安全! 因为,很多经常出现问题字符,都不会出现在应用的参数中!只要我们保证第一个关卡,只允许包含业务相关的字符的字符串进入!应用安全,基本上没有问题!好了,就到这里吧!欢迎朋友们发表自己观点!

Posted in web安全 | Tagged | Leave a comment

HTML Link标签 文档资源、导航、SEO 介绍

定义和用法

head头标签里面,有另一个不起眼的标签。那就是:Link标签。<link> 标签的作用是定义文档与外部资源的关系,最常用的是链接样式表。


<head>
<link rel="stylesheet" type="text/css" href="header.css" />
</head>
以上是链接样式表,这是常用的方法。其实它还可以做文件导航、以及seo方面都可以有用途。我们继续往下吧!

Link属性介绍

属性 描述
rel alternate
appendix
bookmark
chapter
contents
copyright
glossary
help
home
index
next
prev
section
start
stylesheet
subsection
icon (后来补充)
定义当前文档与被链接文档之间的关系
rev alternate
appendix
bookmark
chapter
contents
copyright
glossary
help
home
index
next
prev
section
start
stylesheet
subsection
定义被链接文档与当前文档之间的关系
href URL地址 定义被链接文档的位置
type 定义媒体类型 MIME_TYPE 指定被链接文档的 MIME 类型
media screen
tty
tv
projection
handheld
print
braille
aural
all
规定被链接文档将显示在什么设备上
charset 字符编码如:utf-8,gb213等 指定被链接文档的字符编码方式
hreflang 语言2字代码 language_code 指定被链接文档中文本的语言

其它标准属性:

1、核心属性 (id,class,style,title)  分别是id号,样式名称,单行样式,title描述

2、语言属性(dir,lang,xml:lang)  分别是 文本方向、语言

3、键盘属性(accesskey,tabindex) 分别是 快捷键、tab建索引

以上属性也具有!

 

SEO相关的使用属性

1、canonical属性值

当一个站点,有几个内容一致的页面(相同内容,有多个url地址),这样页面多的出现、会因为大量重复内容出现,被搜索引擎降权!因此,我们可以利用该属性指定页面出处!

如:http://blog.chacuo.net/332.html    http://blog.chacuo.net/?p=332

两个是同一个内容,那么我在http://blog.chacuo.net/?p=332 加入:<link rel=’canonical’ href=’http://blog.chacuo.net/332.html’ />
告诉,搜索引擎,这个页面与322.html一致,以322.html为准,不要收录p=322页面。

2、next,prev,home等属性值,带连接的导航作用

例如:当前页是332.html,里面有:

<link rel=’prev’   href=’http://blog.chacuo.net/331.html’ />  <link rel=’next’   href=’http://blog.chacuo.net/333.html’ />它相关的上一个页面是331.html,下一个页面是333.html。不过,目前搜索引擎对这些支持不是很好!基本作用不大!

小结:

link,rel属性有多种,现在也有新的扩展,例如wordpress中,我们可以看到:EditURI,wlwmanifest属性。我们也可以自己定义新的属性,不过已经确定了名称属性。它的作用已经固定,我们得遵守它的本意!

Posted in web原理 | Tagged , | Leave a comment

meta标签 使用说明(http-equiv、refresh、seo)

meta标签,是在head标签里面,一般用做页面描述的。它的内容,用来描述页面一些信息的,如类型、编码、作者、简介等!虽然,它不作为页面布局显示,但实际上用途非常广的!具体的html定义在:meta定义 

meta组成部分

meta标签共有两个属性,它们分别是http-equiv属性和name属性,不同的属性又有不同的参数值,这些不同的参数值就实现了不同的网页功能。

name属性主要用于描述网页,与之对应的属性值为content,content中的内容主要是便于搜索引擎机器人查找信息和分类信息用的。

http-equiv相当于http的文件头作用,它可以向浏览器传回一些有用的信息,以帮助正确和精确地显示网页内容,与之对应的属性值为content,content中的内容其实就是各个参数的变量值。

Meta标签属性

属性 描述
http-equiv content-type
Content-Language
Pragma
expires
refresh
set-cookie
把 content 属性关联到 HTTP 头部。http协议返回头,都支持!
name author
description
keywords
generator
revised
others
把 content 属性关联到具体属性的值
content 对应(name,http_equiv)选择属性的值 定义与 http-equiv 或 name 属性相关的元信息。

http-equiv response返回头控制

常用来说明页面类型、编码,重定向,以及缓存控制方面!

1、Content-Type和Content-Language (显示字符集的设定)

<meta http-equiv=″content-Type″ content=″text/html; charset=gb2312″>,当前页面是text/html类型,页面编码是gb2312,也可以简写为<meta charset="gb2312">,语言控制:<meta http-equiv="Content-Language" content="zh-cn" /> ,说明该页面是简体中文

2、refresh 自动刷新并且指向新页面

<meta http-equiv=″refresh″ content=″2; URL=http://blog.chacuo.net″>,2秒后,页面自动进入http://blog.chacuo.net

3、Expires(过期控制)

<meta http-equiv="expires" content="Fri,12 Jan 2001 18:18:18 GMT">,可以用于设定网页的到期时间。一旦网页过期,本地缓存将失效,必须重新从服务器读取信息!

4、Pragma(控制缓存模式)

禁止浏览器从本地计算机的缓存中访问页面内容,<meta http-equiv="Pragma" content="no-cache"> 。本地浏览器不保存内容!禁止缓存可以加上:<meta http-equiv="Cache-Control" CONTENT="no-cache"> ,这样一起控制!

5、set-cookie(设置cookie值)

用法:<meta http-equiv="Set-Cookie" content="kkk=ddd; expires=Thu, 11-Jul-23 11:32:15 GMT; path=/; "> 设置cookie,名称是kkk,值为ddd,过期是2023-7-11 19:32:15秒!

帮助主页被各大搜索引擎登录、其它

1、Keywords 描述页面关键词

<meta name="keywords" content="政治,经济,科技,文化,卫生,情感,心灵,娱乐,生活,社会,企业,交通"> ,便于搜索引擎,快速定位页面主题!

2、Description页面简介描述信息

<meta name="description" content="程默博客是一个关注web安全、性能、框架,以及服务器性能、服务器架构、服务器安全,是一个值得Web开发朋友收藏的博客。"/> ,对页面简单描述概括!

3、Author页面所有者

<META name="author" content="chengmo"> 该页面作者是:chengmo

4、Copyright 版权说明

<META name="copyright" content="&copy; 2013 chacuo.net"> 版权信息描述!

5、Date 开创时间

<META name="date" content=”2013-7-11T19:49:37+00:00”>页面开创时间!

6、robots(机器人向导)

说明:robots用来告诉搜索机器人哪些页面需要索引,哪些页面不需要索引。content的参数有all,none,index,noindex,follow,nofollow。默认是all。举例:<meta name="robots" content="none">不索引该页,并且该页里面所有连接也不搜索索引!

以上是meta常见应用,可以对页面进行信息描述,也可以对搜索引擎进行引导!特别是它的属性及值,没有进一步的定义。随着不断应用,可能在后面我们还会扩展出新的属性,以及它对应值!它为今后的扩展预留很多的空间!也有些浏览器,还支持:进入、退出动画,窗口定义,分级定义。不过它不能很好在所有浏览器中兼容,一次没有一一列举!欢迎交流!

Posted in web原理 | Tagged , | Leave a comment

web应用安全之基础(输入参数检查必要性)

好几天没有写了,电脑一直有问题,还没有修好!本来开机故障,修理了下!现在是彻底开机不了!算了,随它去吧,该换个品牌了!先不说这些,我们进入正题,看看web应用安全基数,为什么是输入参数检查!开发web应用,工作中代码审核、漏洞修复!基本是我们对输入参数检查不够!

主要问题出现在3个方面:

1、对检查认识不够!经常忘记必要参数检测,特别对于一些页面只是传值,而没有写入到后端存储的参数,更是很容易遗漏!

2、对那些是输入的、那些是系统环境参数 有些没有明白,导致错误的放过该检查的参数!

3、检查方法不正确、往往检查过后,还存在问题!

 

我说说自己的一些看法吧,所有一切首先要认识到参数检查的重要性!

为什么要参数检查?

我们还是从生活中来看吧,现在社会上,下班回家进入小区,门口保安要检查门卡,有卡才可以进入!到公司了,进门禁系统,公司需要刷员工卡,然后进入公司!现在学校、机关等等,我们发现都会有个检查的,大家都很清楚,它的目的是保证大家安全,让一些自己允许的人才可以进入!我们发现,所有检查地点,都是在分界隔离地方,也就是在进入的入口上!

从上面这些场景,我们发现生活中,为了我们安全!在进入一些私人区域,都有检查口。其实web检查也是可以比拟的!web参数是最前端用户与系统接口地方,因此这个地方检查是必要的!我们只能允许满足要求的进入后端系统!这也是保证后端系统安全的前提!

漏掉该检查地方隐患!

这个问题,同样存在!前段时间,听到一个新闻,一个很高档的小区有很好的安全门禁检查!但是,它的地下车库到楼上,就没有增加检查!后来,一些别有用心的人,专门租车,从地下车库上到居民楼,进行偷盗!还有个新闻,一个小区进门地方,如果是单人的话,会检查,但是如果你开车进入,特别是名牌车!基本上不检查!后来,也导致一伙别有用心的人,驾车进入偷盗!我们做web应用,一定要知道那些参数来源于用户端输入,php代码里面的:$_GET,$_POST,$_REQUEST,$_SERVER,$_COOKIE,$_FILES等。那些来自用户,那些是系统!清清楚楚,明明白白检查!

怎么样检查才正确?

这些我们也可以看看现实生活中,我们发现公司、小区、学校,每个进入的人,都要有一张发的卡,只有持卡人才可以进入!这个是限定用户范围的,只有限定范围才可以进入!这种检查方法,很常用的,也很安全!换个思路,如果小区里面,认为自己小区高档,来小区的都穿着不错。因此,把检查改为:穿正装可以进入!这样一来,如果刚好小区里面有人因为某种原因,而穿着匆忙,可能不让进入!而另外,对于别有用心的人,买套正式衣服应该很容易!因此,也很容易逃过检查!

从上面两个例子我们不难发现,生活中经常检测是:通过发卡,限定用户群;而少用排除法方法!这也是,我们web参数检查中推荐的方法,限定参数的范围;不做、少做参数过滤替换检查!

好了,上面这些方法其实都来自生活,大家一看都明白!如果真的遇到做参数检查时候,有些迷糊!不妨想想生活中例子!其实,程序都是解决实际生活中问题,并且很多都来自于生活!参数需要检查、并且需要正确检查!下一节我将,谈谈对于参数检查范围检查的一些自己看法!欢迎大家交流!

Posted in web安全 | Tagged | Leave a comment

正则表达式性能优化(高效正则表达式书写)

这里说的正则表达式优化,主要是针对目前常用的NFA模式正则表达式,详细可以参考:正则表达式匹配解析过程探讨分析(正则表达式匹配原理)。从上面例子,我们可以推断出,影响NFA类正则表达式(常见语言:GNU Emacs,Java,ergp,less,more,.NET语言,
PCRE library,Perl,PHP,Python,Ruby,sed,vi )其实主要是它的“回溯”,减少“回溯”次数(减少循环查找同一个字符次数),是提高性能的主要方法。 我们来看个例子:

源字符串:<script type="text/javascript">adsfadfsdasfsdafdsfsadfsa</script>

匹配要求,匹配<script….>….</script>标签里面所有内容,包括改标签

常见写法(1),因为<script后面可能出现字符、空白、特殊符号等,还有标签里面也可能出现各种js代码。我们简单方法是:

正则表达式:<script.*?>.*?</script> (测试工具使用了:regexBuddy)

正则表达式性能优化 
总共花费115步,回溯了:48次。 因为我们使用”.”字符,匹配默认情况下除了\n之外所有字符。

方法(2),我们分析特点发现,<script…>后面,应该是除了”>”之外都可以字符,然后一对<script>标签里面js内容。可以定义为除了”<”之外。(这里面我只是举例说明优化方法,实际网页中script标签里面,常见都会出现有”<”字符了

正则表达式:<script[^?>]+>[^<]+</script>

正则表达式性能优化 
19步,0次回溯! ,步骤只有原先的15%左右,性能几倍的提升了!

从上面我们看到,不同正则表达式,对通用字符配平,性能相差会很大。减少“回溯”是最好的方法,减少回溯其中最主要的方法是:”用最小范围的元字符,尽量避免用过大的元字符!”。一般规律如下:

1、使用正确的边界匹配器(^、$、\b、\B等),限定搜索字符串位置

2、使用具体的元字符、字符类(\d、\w、\s等) ,少用”.”字符

3、使用正确的量词(+、*、?、{n,m}),如果能够限定长度,匹配最佳

4、使用非捕获组、原子组,减少没有必要的字匹配捕获用(?:)

如:我想匹配一些英文字母,它后面接的是数字。如:abc1234,我可以写 “\w+\d+”,也可以写”[a-zA-Z]+\d+” ,其中第一个\w+会先匹配所有abc1234,然后回溯,匹配满足\d+格式。一共4步,而后面这个只需要2步,步骤减少一半了!好了,今天就先到这里,欢迎大家讨论、交流!

Posted in web原理, web性能 | Tagged | Leave a comment

京东商城Jsonp 资源越权限访问漏洞分析

最近比较忙,电脑一直有问题,还没有修理好。本来以前买个电脑才3000来块,现在刚好过保几个月,然后修下说要700多,如果换配件要1000多。这个电脑现在买个新二手,应该也就千把块,够黑了。呵呵,不说这么些了。今天我们继续分析京东商城Jsonp使用漏洞之二,未对资源访问进行授权。

对于Jsonp漏洞,这里我就不细说了,详细可以看:Jsonp常见安全漏洞分析(京东商城Jsonp 漏洞分析) ,从上面文章,我们知道jsonp是可以跨域名调用的。这个漏洞是:没有授权网站,可以直接在该站点访问jsonp接口资源。可能有朋友会问题:“这个漏洞有什么影响呢?”,一般我们常见有:

1.对于存在漏洞的网站来说:jsonp资源给外部调用,浪费接口资源,也给调用带来压力

2.利用者,可以通过jsonp获取网站资源,构造钓鱼站点,或者给用户发送钓鱼站点。获取用户在漏洞网站上面的用户信息(用户登陆情况下),或者偷偷操作用户功能!

具体我们看看实例:

京东商城jsonp漏洞 
我们看看,如果有个另外域名站点,怎么样调用该信息!
<?php
header("Content-Type: text/html; charset=utf-8");
?>
<script>
function jsonp13724(d)
{
	console.log(d);
}
</script>
<script type="text/javascript" src="http://my.jd.com/order/rec.action?jsoncallback=jsonp13724">
</script>
京东商城jsonp漏洞 
 

总结,通过上面例子,对于jsonp跨站访问,带来资源别越权调用漏洞。我们应该知道了它的原理。如果要防止这类越权访问,我们一般只需要对访问来源:reffer进行授权 这是最简单的方法! 也是最常用方法了。如果有朋友会问,这个漏洞有什么危害呀,看起来好像没有什么问题?如果一个站点别有用心站点(这里叫A站),在京东商城上面发了一个链接。有不小心朋友点过去。这个时候,你刚好自己登陆了。这个时候,A站就可以悄悄读到你在京东商城一些信息了。到此,对京东商城jsonp漏洞都分析完毕,国内这么大一个商城,在这个方面使用,几乎没有做任何检测,确实有些不应该!希望,以上分析对即将应用jsonp朋友有所帮助!也需要大家发表自己看法!

Posted in web安全 | Tagged | Leave a comment

GBK字符编码(字符集)缺陷攻击(注入)原理

上一节,我们分析了。选择不同编码可能会导致程序带来本身潜在的漏洞。这次我们以GBK编码为例,看看怎么样通过该编码注入到系统中。目前很多开源系统都存在类似的注入问题。我们先来,从一个Demo开始!

GBK字符集漏洞注入原理

<?php
$u=isset($_GET['u'])? $_GET['u']:'';
$u=addslashes($u);
$sql = "select * from user where user='$u'";

以上是我们写的一个测试例子(GBK编码),现在很多开源系统,比较少的进行统一参数过滤,有时候为了防止注入,就直接对参数进行转义处理。我们看看,这样一个例子,我们怎么样注入进系统!

步骤 备注
1.传入值%D5%27 or 1=1# u参数参入上面值 (%27 对应是“’”  单引号字符)
2.GET获取的值 0xD50x27 or 1=1#
3.Addslashes后值 0xD50x5C0x27 or 1=1 (意思是:誠’ or 1=1#’)  #字符后面被注释掉
4.sql值 将变成 select * from user where user=’誠’ or 1=1#’
#号是sql注释符号,后面字符将截取掉
 
GBK编码漏洞注入测试 

GPC转义打开,或者是通过addslashes函数,会自动在字符是单引号()、双引号(")、反斜线(\)与 NUL(NULL 字符)等字符前面增加“\”字符(0x5c),例子里面,我们采用一个特殊前面字节0xD5,它将与该字节组合变成:0xD50x5c ,刚好是gbk字符集中字符:”誠“ 了。 后面的0×27这个单引号被保留下来了!

GBK字符集漏洞注入总结

呵呵,这个很有意思吧,好了。我们来总结下,这类注入是2个条件的。第一是:gbk编码,第二是:程序采用了转义方法,转义了输入。 这2个条件不苛刻,目前大部分开源系统都有gbk,utf-8编码的源码,剩下的就去看看,源码里面有没有用类似转义方法,过滤字符串了。如果有,那么这个系统某个功能,你可以去渗透下了。这个编码漏洞,网上面提的很多,不过很多时候,没有引起开发人员的足够重视,还是在不断的重现!

那么我们如果要注入一个参数,我们该选择什么样的入参参数呢?其实这种转义字符是单引号()、双引号(")、反斜线(\)与 NUL(NULL 字符),我们这些字符往往在程序中有特殊作用,我们只需要在前面加一个在>7F字符,后面接一个%27()、%22(")、%5C(\)、%00(NULL 字符),就可以自己让这4个字符,可以逃脱转义了。

好了,这个漏洞原理及注入过程分析就这些了。我们开发时候,需要注意这个问题,特别是使用GBK编码开发程序,要有这个方面的预备知识,对于自己开发安全的代码会有帮助的。更多的GBK编码,可以看http://doc.chacuo.net/gbk !(这里有很多落在5c中文字符呢)也欢迎讨论!

Posted in web安全 | Tagged , | Leave a comment

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

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

多字节编码由来

我们先来看看最常用的,最小字符集是ascii,对应的二级制可以表示为:00-7F 编码 。它也是我们计算机使用最早通用的字符集。前期几乎可以表示所有英文字符。后来,更多使用计算机国家加入后,我们就想在计算机中表示中文字符。我们知道常见中文就有7000多个字符。ascii码就只有128字符,只有0-127编码位置,远远不够用了。因此,我们就开始制作更大字符集,并且保证兼容ascii编码。要支持更多字符,选择更大字符集。我们只能用多个字节来描述一个字符了。为了很好的与ascii码,区分开来!一般做法是:每个字节值都大于>7F,如果是2个字节,那么就是:[>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] ) (GBK编码),我们发现由2个字节组成,首字节范围在7F之上,而第2个字节,有一部分在0×40-0x7E了。这就是导致bug原因。我们看看下面例子吧!

从ASCII码表中,我们知道0×40-0x7E 包含字符有:“A-Za-z@[\]^_`{|}~”,一共有63字符呢。

GBK编码漏洞 

选择gbk编码,运行上面代码,就一条简单的命令导致出现错误,说字符串 赋值 没有结束! 呵呵,估计很多人看到这个就会认为是php 出Bug了。但是,如果我们变成$a=”誠a”,发现可以正常运行了。是不是觉得很奇葩啦!!

 

原因分析:我们知道文件存在磁盘都是二级制方式,无论你存什么字符,最终都是以该字符的在所选字符集中字符编码保存。php解析时候,最小分析单元是字节。无论你是多字节还是单字节字符。最终都是按照字节来处理的。“誠”  GBK编码是 D55C,php按字节来解释,5C对应字符是“\” 字符。后面直接跟个‘”’,相当于被转义了。 因为没有闭合,因此出现错误!大家看出问题所在了吧,按自己处理的话,会自然把多字节拆成单字节了。这样就会出现很多奇怪问题了。

总结:通过上面讲解,我们知道了多字节编码过程,以及GBK导致简单程序出错的原因。其实,我们很多程序语言里面,都会以单个字节来解析的。这样,当你选择多字节GBK编码中文时,刚好有字节落在特殊位置,将会出现奇怪错误问题。而且,还将给系统带来本身的漏洞,后面我再说说,GBK编码缺陷,导致漏洞、以及专门利用该编码漏洞缺陷进行系统入侵!好了,先到这里了,欢迎交流!

Posted in web原理, web安全 | Tagged , | Leave a comment