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