0.參考文獻
1.分析
一般在瀏覽器中輸入網(wǎng)址訪問資源都是通過GET方式入篮;在FORM提交中吭历,可以通過Method指定提交方式為GET或者POST忘苛,默認為GET提交艘狭。Http定義了與服務(wù)器交互的不同方法趣避,最基本的方法有4種尸执,分別是GET婚夫,POST波桩,PUT,DELETE请敦。
URL全稱是資源描述符镐躲,我們可以這樣認 為:一個URL地址,它用于描述一個網(wǎng)絡(luò)上的資源侍筛,而HTTP中的GET萤皂,POST,PUT匣椰,DELETE就對應(yīng)著對這個資源的查 裆熙、改 、增 禽笑、刪 4個操作入录。
根據(jù)HTTP規(guī)范,GET用于信息獲取佳镜,而且應(yīng)該是安全的和冪等的僚稿,可以參見安全的(Safe)和冪等的(Idempotent)。
安全的是指沒有明顯的對用戶有影響的副作用(包括修改該資源的狀態(tài))蟀伸。HTTP方法里的GET和HEAD都是安全的蚀同。
冪等的是指一個方法不論多少次操作,結(jié)果都是一樣啊掏。PUT(把內(nèi)容放到指定URL)蠢络,DELETE(刪除某個URL代表的資源),雖然都修改了資源內(nèi)容迟蜜,但多次操作刹孔,結(jié)果是相同的,因此和HEAD娜睛,GET一樣都是冪等的髓霞。
所以根據(jù)HTTP協(xié)議,GET是安全的微姊,也是冪等的酸茴,而POST既不是安全的,也不是冪等的兢交。但在實際應(yīng)用中薪捍,以上2條規(guī)定并沒有這么嚴格。比如,新聞?wù)军c的頭版不斷更新酪穿。雖然第二次請求會返回不同的一批新聞凳干,該操作仍然被認為是安全的和冪等的。因為它總是返回當(dāng)前的新聞被济。從根本上說救赐,如果目標是當(dāng)用戶打開一個鏈接時,他可以確信從自身的角度來看沒有改變資源即可只磷。
通常情況下我們都說POST的安全性要比GET的安全性高(注意:這里所說的安全性和上面GET提到的“安全”不是同個概念经磅。上面“安全”的含義僅僅是不作數(shù)據(jù)修改,而這里安全的含義是真正的Security的含義)钮追,比如:通過GET提交數(shù)據(jù)预厌,用戶名和密碼將明文出現(xiàn)在URL上,比如有一個常見的url:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD元媚,通過這個url我們就知道該用戶的用戶名是:hyddd轧叽,密碼是idontknow。但是就因為這個原因說 POST 比 GET 安全是錯的刊棕,因為POST和GET都是明文傳輸炭晒,用httpfox等插件,或者像WireShark 等類似工具就能觀察到甥角。
POST和GET的差別其實是很大的网严。語義上,GET是獲取指定URL上的資源蜈膨,是讀操作屿笼,重要的一點是不論對某個資源GET多少次,它的狀態(tài)是不會改變的翁巍,在這個意義上,我們說GET是安全的(不是被密碼學(xué)或者數(shù)據(jù)保護意義上的安全)休雌。因為GET是安全的灶壶,所以GET返回的內(nèi)容可以被瀏覽器,Cache服務(wù)器緩存起來(其中還有很多細節(jié)杈曲,但不影響這里的討論)驰凛。
而POST的語意是對指定資源“追加/添加”數(shù)據(jù),所以是不安全的担扑,每次提交的POST恰响,參與的代碼都會認為這個操作會修改操作對象資源的狀態(tài),于是涌献,瀏覽器在你按下F5的時候會跳出確認框胚宦,緩存服務(wù)器不會緩存POST請求返回內(nèi)容。