get和post對比區(qū)別說緩沖區(qū)溢出
網(wǎng)頁表單(form)提交時可選擇2種提交方式:get和post。我們大都知道提交表單數(shù)據(jù)時應該使用post,也知道get方式不安全。是什么造成了get和post的區(qū)別,本文將從http協(xié)議層面分析,來說說get和post境遇不同的根本原因。
先來看看一個簡單的hello woeld頁面的http消息:
瀏覽器請求”http://127.0.0.1/test/hello.html”發(fā)送的http協(xié)議報文:
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消息)。請求協(xié)議報文第1行“GET”表明了提交方式,“/test/hello.html”表示請求的文家及路徑,“HTTP/1.1”表示使用的http協(xié)議版本。第2行表示請求的服務器IP和端口,注意“80”是默認添加上的端口號。后面幾行描述了客戶端系統(tǒng)、瀏覽器的一些信息。
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網(wǎng)頁文件實例 –>
<html>
<head>
<title>你好,世界!</title>
</head>
<body>
<h3>世界你好!</h3>
</body>
</html>
“200 OK”表示服務應答編碼,表示成功,常見的還有“404”、“500”等。“Content-Length: 145”表示應答網(wǎng)頁的長度,“Date: Wed, 26 Dec 2007 18:00:59 GMT”是應答時間,在這之后空一行,然后是網(wǎng)頁正文。
對于http通訊,總是像上面這樣客戶端(瀏覽器)發(fā)出請求,服務端(web服務器)給予應答,表單提交也同樣如此,下面分析一個簡單的表單。
表單提交
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請求協(xié)議報文:
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方式表單的提交數(shù)據(jù)顯示在請求http協(xié)議的第一行,和請求地址用“?”間隔(這一行同樣會顯示在瀏覽器地址欄中)。從“ userName=lisi&password=1111&sex=f&interest=dance&interest=sing&submit=%CC%E1%BD%BB”可以分析出表單提交的數(shù)據(jù):
■ 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”,提交同樣的數(shù)據(jù),http請求協(xié)議報文如下:
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
區(qū)別
對比一下get和post方式的請求http協(xié)議報文,注意以下幾點:
■ 協(xié)議第一行起始,get方式聲明為“GET”,post方式聲明為“POST”。
■ 提交數(shù)據(jù)“userName=lisi&password=1111&sex=f&interest=dance&interest=sing&submit=%CC%E1%BD%BB”,對于get方式在第一行,對于post方式在最后一行,兩種方式對表單數(shù)據(jù)的編碼完全一致。
■ post方式多了3行: Content-Type: application/x-www-form-urlencoded,Content-Length: 82,和數(shù)據(jù)前的空行。
僅從以上幾點,很難想象出get和post究竟有什么實質(zhì)性的區(qū)別,為什么在使用中差別如此之大,真是以訛傳訛嗎?就像“菠菜含鐵量高”被誤傳了十來年,直到有人證明當年計算鐵含量時標錯了小數(shù)點。
實質(zhì)差別只有一點:“Content-Length: 82”,在post中表示了提交數(shù)據(jù)“userName=lisi&password=1111&sex=f&interest=dance&interest=sing&submit=%CC%E1%BD%BB”的長度,而get中沒有。
正是此導致服務端在接收get提交的數(shù)據(jù)時,極易出現(xiàn)一個安全漏洞:緩沖區(qū)溢出。
緩沖區(qū)溢出
■ 名詞解釋 【緩沖區(qū)溢出】: 通過往程序的緩沖區(qū)寫超出其長度的內(nèi)容,造成緩沖區(qū)的溢出,從而破壞程序的堆棧,使程序轉(zhuǎn)而執(zhí)行其它指令,以達到攻擊的目的。
服務端程序在接收客戶端表單提交的數(shù)據(jù)時,需要先將數(shù)據(jù)存儲到一個內(nèi)存空間,然后做解析等后續(xù)工作,這個內(nèi)存空間一般稱之為接收緩沖區(qū)。對于post數(shù)據(jù)因為有Content-Length標記,服務端可以按標記的長度創(chuàng)建一個等于或稍大于提交數(shù)據(jù)的緩沖區(qū);對于get,因為事先不知道提交的數(shù)據(jù)有多少,需要估計緩沖區(qū)長度,如果緩沖區(qū)很大而接收數(shù)據(jù)很小會造成內(nèi)存浪費,而如果緩沖區(qū)小于接收數(shù)據(jù),就可能造成緩沖區(qū)溢出。
緩沖區(qū)溢出
“聰明的”黑客,會在溢出部分放置特殊的代碼來攻陷你的服務器。
現(xiàn)代的WWW服務器并不是如此弱不禁風,但完全、有效的解決緩沖區(qū)溢出漏洞卻很難,操作系統(tǒng)、C語言程序都提供了滋生此問題的溫床,至今還有相當部分的WWW服務軟件有此漏洞,可以搜索一下“get 緩沖區(qū)溢出”看看。
這也就是不建議使用get方式提交表單數(shù)據(jù)的原因所在。
深入思考去學習
隨便翻看http入門書籍,都有get和post的區(qū)別的描述,但往往只說其然,不說其所以然,而年輕的程序員往往記憶力很好,卻忽略了更重要的“思考”。
本篇文章的另一個目的是關于學習方法的: 要習慣于深入思考,要懷著疑問、探索、證明的態(tài)度去學習,哪怕是被廣泛認為是“公理”的觀點。
文章到此結束,純技術文章,由鄭州北大青鳥http:///整理,轉(zhuǎn)載請注明!
本文由站河南北大青鳥校區(qū)整編而成,如需了解更多IT資訊類的文章、新聞、課程和學習技巧、就業(yè)案例、招生詳情等問題,可以對在線咨詢老師進行一對一問答!
- 上一篇:簡單幾步看自己的電腦配置
- 下一篇:怎么用關閉Win7中讓防火墻TCP/UDP端口
推薦資訊
- 鄭州北大青鳥翔天信鴿軟件學院A... 2020-07-16
- 緣何企業(yè)小老板都不看好大學生... 2012-10-13
- 職場那些事必須忍一忍... 2012-10-13
- 鄭州北大青鳥翔天信鴿計算機IT學... 2023-06-08
- 計算機專業(yè)學校北大青鳥好不?... 2019-07-20
熱點資訊
- 電腦溫度多少是正常的情況呢?... 2018-09-07
- 四個策略及簡單的防護方法... 2018-09-07
- 對硬盤進行雙分區(qū)有什么好處... 2018-09-07
- 文件加密的幾個簡單方法... 2018-09-07
- 計算機小技巧,80G硬盤巧變變成... 2018-09-07