郑州信息科技中专职业学院中专部

不仅仅统招学历哟

  • 热门专业!
  • 大学校园!
  • 就业保障!
  • 拿学历又能高薪就业,谁能不爱!
了解详情>
郑州北大青鸟翔天信鸽参加“安心学习·放心就业”公约签约仪式

让每一个家庭“安心”、“放心”

  • 教学为本
  • 师爱为魂
  • 安心学习
  • 放心就业
了解详情>
北大青鸟20周年庆典与总部年会郑州翔天信鸽荣获7项荣誉

深耕细作IT职业教育15载

  • 青鸟之星教学质量大奖
  • 卓越风云人物
  • 北大青鸟中心理事会成员
  • 七项荣耀载誉而行!
了解详情>
郑州北大青鸟学员喜获全国IT精英挑战赛冠军

我们教学怎么样

  • 实力见证
  • 网络组一等奖
  • 网络组二等奖
  • 软件组四等奖
  • 200家校区脱颖而出!
了解更多>
北大青鸟荣获315重承诺守信用放心品牌

北大青鸟职业IT20周年

  • 重承诺
  • 守信用
  • 放心品牌
  • 放心学习
  • 靠靠谱谱好就业!
了解更多>
学IT好工作高薪就业

我命由我不由天

  • 学个性的技术
  • 做爱做的事
  • 挣满意的钱
  • 衣食无忧
  • 选择宽且高大尚!
了解更多>
郑州北大青鸟IT培训办学14年

我们靠不靠谱

  • 14年办学
  • 14年磨练
  • 14年成长
  • 14年探索
  • 只为让每个学员成材!
了解更多>
郑州北大青鸟IT培训

不打工也牛掰

  • 好工作
  • 好环境
  • 高薪资
  • 好课程
  • 支持你成为有“钱”人!
了解更多>

学IT就读北大青鸟

  • 好工作
  • 好未来
  • 好老师
  • 好课程
  • 支持你成为受人尊敬的人!
了解更多>
get和post对比区别说缓冲区溢出
作者:北大青鸟 添加时间:03-06 浏览次数:0

 网页表单(form)提交时可选择2种提交方式:get和post。我们大都知道提交表单数据时应该使用post,也知道get方式不安全。是什么造成了get和post的区别,本文将从http协议层面分析,来说说get和post境遇不同的根本原因。

 
先来看看一个简单的hello woeld页面的http消息:
浏览器请求”http://127.0.0.1/test/hello.html”发送的http协议报文:
GET /test/hello.html HTTP/1.1
Host: 127.0.0.1:80
User-Agent: Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.8.1.11) Gecko/20071204 Ubuntu/7.10 (gutsy) Firefox/2.0.0.11
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
捕获http报文需要使用工具程序(这里我使用自己编写的TCP代理程序来截获http消息)。请求协议报文第1行“GET”表明了提交方式,“/test/hello.html”表示请求的文家及路径,“HTTP/1.1”表示使用的http协议版本。第2行表示请求的服务器IP和端口,注意“80”是默认添加上的端口号。后面几行描述了客户端系统、浏览器的一些信息。
WEB服务器应答报文:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=GBK
Content-Length: 145
Date: Wed, 26 Dec 2007 18:00:59 GMT
 
<!– HTML网页文件实例  –>
<html>
    <head>
        <title>你好,世界!</title>
    </head>
    <body>
        <h3>世界你好!</h3>
    </body>
</html>
“200 OK”表示服务应答编码,表示成功,常见的还有“404”、“500”等。“Content-Length: 145”表示应答网页的长度,“Date: Wed, 26 Dec 2007 18:00:59 GMT”是应答时间,在这之后空一行,然后是网页正文。

对于http通讯,总是像上面这样客户端(浏览器)发出请求,服务端(web服务器)给予应答,表单提交也同样如此,下面分析一个简单的表单。
get和post对比区别说缓冲区溢出
表单提交
1. get方式提交:
<form name="form1" method="get" action="result.jsp">
姓名:<input type="text" name="userName" value=""><br>
密码:<input type="password" name="password" value=""><br>
性别:<input type="radio" name="sex" value="m">男 <input type="radio" name="sex" value="f">女<br>
爱好:<input type="checkbox" name="interest" value="dance">跳舞
         <input type="checkbox" name="interest" value="sing">唱歌
         <input type="checkbox" name="interest" value="basketball">篮球<br>
<br>    <input type="submit" name="submit" value="提交">
</form>
注意在<form>标签中,method=”get”。
http请求协议报文:
GET /get_post/result.jsp? userName=lisi&password=1111&sex=f&interest=dance&interest=sing&submit=%CC%E1%BD%BB HTTP/1.1
Host: 127.0.0.1:8090
User-Agent: Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.8.1.11) Gecko/20071204 Ubuntu/7.10 (gutsy) Firefox/2.0.0.11
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
get方式表单的提交数据显示在请求http协议的第一行,和请求地址用“?”间隔(这一行同样会显示在浏览器地址栏中)。从“ userName=lisi&password=1111&sex=f&interest=dance&interest=sing&submit=%CC%E1%BD%BB”可以分析出表单提交的数据:

■ userName=lisi 姓名文本框输入的是“lisi”
■ password=1111 密码文本框输入的是“111”
■ sex=f 性别单选钮选择的是“女”
■ interest=dance&interest=sing 爱好多选框选择了2个:跳舞、唱歌
■ submit=%CC%E1%BD%BB 点击“提交”按钮进行提交(submit按钮也是表单元素,同样会提交给服务端),“%CC%E1%BD%BB”是按钮的value属性”提交”两个汉字的gb2312的16位编码。
下面看看post方式和get有什么不同。
2. post方式提交:
将<form>中的method=”get”改为method=”post”,提交同样的数据,http请求协议报文如下:
POST /get_post/result.jsp HTTP/1.1
Host: 127.0.0.1:8090
User-Agent: Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.8.1.11) Gecko/20071204 Ubuntu/7.10 (gutsy) Firefox/2.0.0.11
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 82
 
userName=lisi&password=1111&sex=f&interest=dance&interest=sing&submit=%CC%E1%BD%BB
区别
对比一下get和post方式的请求http协议报文,注意以下几点:
■ 协议第一行起始,get方式声明为“GET”,post方式声明为“POST”。
■ 提交数据“userName=lisi&password=1111&sex=f&interest=dance&interest=sing&submit=%CC%E1%BD%BB”,对于get方式在第一行,对于post方式在最后一行,两种方式对表单数据的编码完全一致。
■ post方式多了3行: Content-Type: application/x-www-form-urlencoded,Content-Length: 82,和数据前的空行。
仅从以上几点,很难想象出get和post究竟有什么实质性的区别,为什么在使用中差别如此之大,真是以讹传讹吗?就像“菠菜含铁量高”被误传了十来年,直到有人证明当年计算铁含量时标错了小数点。
实质差别只有一点:“Content-Length: 82”,在post中表示了提交数据“userName=lisi&password=1111&sex=f&interest=dance&interest=sing&submit=%CC%E1%BD%BB”的长度,而get中没有。

正是此导致服务端在接收get提交的数据时,极易出现一个安全漏洞:缓冲区溢出。
缓冲区溢出
■ 名词解释 【缓冲区溢出】: 通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。
服务端程序在接收客户端表单提交的数据时,需要先将数据存储到一个内存空间,然后做解析等后续工作,这个内存空间一般称之为接收缓冲区。对于post数据因为有Content-Length标记,服务端可以按标记的长度创建一个等于或稍大于提交数据的缓冲区;对于get,因为事先不知道提交的数据有多少,需要估计缓冲区长度,如果缓冲区很大而接收数据很小会造成内存浪费,而如果缓冲区小于接收数据,就可能造成缓冲区溢出。

缓冲区溢出
“聪明的”黑客,会在溢出部分放置特殊的代码来攻陷你的服务器。
现代的WWW服务器并不是如此弱不禁风,但完全、有效的解决缓冲区溢出漏洞却很难,操作系统、C语言程序都提供了滋生此问题的温床,至今还有相当部分的WWW服务软件有此漏洞,可以搜索一下“get 缓冲区溢出”看看。
get和post对比区别说缓冲区溢出
这也就是不建议使用get方式提交表单数据的原因所在。
深入思考去学习
随便翻看http入门书籍,都有get和post的区别的描述,但往往只说其然,不说其所以然,而年轻的程序员往往记忆力很好,却忽略了更重要的“思考”。
本篇文章的另一个目的是关于学习方法的: 要习惯于深入思考,要怀着疑问、探索、证明的态度去学习,哪怕是被广泛认为是“公理”的观点。
文章到此结束,纯技术文章,由郑州北大青鸟http://www.hnbenet.com/整理,转载请注明!

本文由站河南北大青鸟校区整编而成,如需了解更多IT资讯类的文章、新闻、课程和学习技巧、就业案例、招生详情等问题,可以对在线咨询老师进行一对一问答!


分享到: