从缓存角度说post和get的区别(摘抄)
来源:互联网 发布:苹果电脑c语言编程软件 编辑:程序博客网 时间:2024/06/05 09:53
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位编码。
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的区别(摘抄)
- GET和POST区别及缓存问题
- 从HTTP GET和POST的区别说起
- 从HTTP GET和POST的区别说起
- 从HTTP GET和POST的区别说起
- 从HTTP GET和POST的区别说起
- 从HTTP GET和POST的区别说起
- 从HTTP GET和POST的区别说起(面试心得)
- get 和post 的区别
- get和post的区别
- get和post的区别
- post和get的区别
- Get和Post的区别
- get和post的区别
- post和get的区别
- post和get的区别
- Post和Get的区别
- Get和Post的区别
- 海恩法则
- 《从零开始学Swift》学习笔记(Day 33)——属性观察者
- svn命令在linux下的使用
- Wireless之无线信道
- Android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能
- 从缓存角度说post和get的区别(摘抄)
- 准备做个门户网站--美丽邵阳(一)
- Linux 学习笔记 (四)Ubuntu14.04 解决上网问题安装无线网卡驱动
- golfing interface学习
- Context的使用(Using Context)
- 命令与文件的查询 which whereis locate find
- 学习笔记之eclipse中处理js文件报错
- cisco命令行手册
- <仅是自己做笔记。。。系列-13>输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数, 使其和等于 m ,要求将其中所有的可能组合列出来.