1.超文本傳輸協議
超文本傳輸協議(HTTP)的設計目的是保證客戶機與服務器之間的通信,web 瀏覽器可能是客戶端,而計算機上的網絡應用程序也可能作為服務器端。
HTTP的工作方式是客戶機與服務器之間的請求-應答協議,HTTP協議以明文方式發送內容,不提供任何方式的數據加密,如果攻擊者截取了Web瀏覽器和網站服務器之間的傳輸報文,就可以直接讀懂其中的信息,
因此,HTTP協議不適合傳輸一些敏感信息,比如:信用卡號、密碼等支付信息。
在使用網頁瀏覽器(web browser)時候的流程,我們首先在瀏覽器中的地址欄中輸入URL(Uniform Resource Locator 統一資源定位符 簡單來說是網址),瀏覽器根據URL從web服務器端獲取文件資源,從而顯示出web頁面。
在上面過程中web使用的協議規范就是HTTP:
2.GET,POST請求
HTTP中的GET,POST,PUT,DELETE對應着對這個資源的查,改,增,刪4個操作。GET一般用於獲取/查詢資源信息,而POST一般用於更新資源信息。
1.根據HTTP規范,GET用於信息獲取,而且應該是安全的和冪等的。
(1).安全的意味着該操作用於獲取信息而非修改信息。GET 請求僅僅是獲取資源信息,不會非修改信息。
(2).冪等的意味着對同一URL的多個請求應該返回同樣的結果。
2.根據HTTP規范,POST表示可能修改變服務器上的資源的請求
讀者對新聞發表自己的評論應該通過POST實現,因為在評論提交后站點的資源被修改了。
1.對資源的增,刪,改,查操作,都可以通過GET/POST完成,不需要用到PUT和DELETE。
2.早期的Web MVC框架設計者們並沒有有意識地將URL當作抽象的資源來看待和設計,所以傳統的Web MVC框架基本上都只支持GET和POST兩種HTTP方法,而不支持PUT和DELETE方法。
3.從表面現像到原理去看GET和POST的區別
1.
表象:
GET請求的數據會附在URL之后(就是把數據放置在HTTP協議頭中),以?分割URL和傳輸數據,參數之間以&相連,如:https://www.sogou.com/sogou?prs=5&rfg=1&query=111+111&pid=AQktG&ie=utf8。
如果數據是英文字母/數字,原樣發送,如果是空格,轉換為+,如果是中文/其他字符,則直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX為該符號以16進制表示的ASCII。
POST把提交的數據則放置在是HTTP包的包體中,即在FORM(表單)中。
原理:
get是把參數數據隊列加到提交表單的ACTION屬性所指的URL中,值和表單內各個字段一一對應,在URL中可以看到。
post是通過HTTP post機制,將表單內各個字段與其內容放置在HTML HEADER內一起傳送到ACTION屬性所指的URL地址,用戶看不到這個過程。
2.
(1).首先是"GET方式提交的數據最多只能是1024字節",因為GET是通過URL提交數據,那么GET可提交的數據量就跟URL的長度有直接關系了。
而實際上,URL不存在參數上限的問題,HTTP協議規范沒有對URL長度進行限制,這個限制是特定的瀏覽器及服務器對它的限制。
IE對URL長度的限制是2083字節(2K+35)。對於其他瀏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決於操作系統的支持。
注意這是限制是整個URL長度,而不僅僅是你的參數值數據長度。
(2).理論上講,POST是沒有大小限制的,HTTP協議規范也沒有進行大小限制,說“POST數據量存在80K/100K的大小限制”是不准確的,POST數據是沒有限制的,起限制作用的是服務器的處理程序的處理能力。
對於ASP程序,Request對象處理每個表單域時存在100K的數據長度限制。但如果使用Request.BinaryRead則沒有這個限制。
在IIS 6.0之前沒有這些限制,而對於IIS 6.0,微軟出於安全考慮,加大了限制,我們還需要注意:
- IIS 6.0默認ASP POST數據量最大為200KB,每個表單域限制是100KB。
- IIS 6.0默認上傳文件的最大大小是4MB。
- IIS 6.0默認最大請求頭是16KB。
3.
原理:
對於get方式,服務器端用Request.QueryString獲取變量的值,對於post方式,服務器端用Request.Form獲取提交的數據。在JSP中,用request.getParameter(\"XXXX\")來獲取,雖然jsp中也有request.getQueryString()方法,但使用起來比較麻煩,比如:傳一個test.jsp?name=hyddd&password=hyddd,用request.getQueryString()得到的是:name=hyddd&password=hyddd。在PHP中,可以用$_GET和$_POST分別獲取GET和POST中的數據,而$_REQUEST則可以獲取GET和POST兩種請求中的數據。值得注意的是,JSP中使用request和PHP中使用$_REQUEST都會有隱患
4.
原理:
POST的安全性要比GET的安全性高。注意:這里所說的安全性和上面GET提到的“安全”不是同個概念。上面“安全”的含義僅僅是不作數據修改,而這里安全的含義是真正的Security的含義,比如:通過GET提交數據,用戶名和密碼將明文出現在URL上,因為
- 登錄頁面有可能被瀏覽器緩存
- 其他人查看瀏覽器的歷史紀錄,那么別人就可以拿到你的賬號和密碼了
- 使用GET提交數據還可能會造成Cross-site request forgery攻擊。
4.curl命令
4.1簡介
linux系統下可以用curl和wget命令來模擬Http的請求。
curl不僅僅可以模擬Http的請求,它是一個工具,用於傳輸來自服務器或者到服務器的數據。「向服務器傳輸數據或者獲取來自服務器的數據」
可支持的協議有(DICT、FILE、FTP、FTPS、GOPHER、HTTP、HTTPS、IMAP、IMAPS、LDAP、LDAPS、POP3、POP3S、RTMP、RTSP、SCP、SFTP、SMTP、SMTPS、TELNET和TFTP)。
curl提供了大量有用的技巧,比如代理支持、用戶身份驗證、FTP上傳、HTTP post、SSL連接、cookie、文件斷點續傳、Metalink等等。
假設目標url 為:127.0.0.1:8080/login
使用curl發送GET請求:curl protocol://address:port/url?args
curl http://127.0.0.1:8080/login?admin&passwd=12345678
使用curl發送POST請求:curl -d "args" protocol://address:port/url
curl -d "user=admin&passwd=12345678" http://127.0.0.1:8080/login
這種方法是參數直接在header里面的,如需將輸出指定到文件可以通過重定向進行操作.
curl -H "Content-Type:application/json" -X POST -d 'json data' URL
curl -H "Content-Type:application/json" -X POST -d '{"user": "admin", "passwd":"12345678"}' http://127.0.0.1:8000/login
4.2 Curl命令的data, data-ascii, data-binary, data-raw和data-urlencode詳解
首先說明如下給出的選項的相同點
- 模擬Web頁面中提交表單,用於POST請求
- 默認Content-type為application/x-www-form-urlencoded
- 選項的value如果是@a_file_name,表示數據來自一個文件
- 選項的value如果是-,表示讀取stdin作為提交的數據,即從標准輸入設備即時提供數據值
不同點
1) -d,--data key=value
數據為純文本數據。
value如果是@a_file_name,表示數據來自一個文件,文件中的回車符和換行符將被轉換
示例:
curl -X POST -d mykey1=myvalue1 http://myapi.url.com curl -X POST -d mykey1=myvalue1 -d mykey2=myvalue2 http://myapi.url.com curl -X POST -d 'mykey1=myvalue1&mykey2=myvalue2' http://myapi.url.com curl -X POST -H Content-Type:application/x-www-form-urlencoded -d 'mykey1=myvalue1&mykey2=myvalue2' http://myapi.url.com curl -X POST -H Content-Type:application/json -d '{"mykey1": "myvalue1", "mykey1": "myvalue2"}' http://myapi.url.com curl -X POST -H Content-Type:application/x-www-form-urlencoded -d mykey1=@myvalue1_from_file http://myapi.url.com
2) --data-ascii <key=value>
完全等價於-d
3) --data-binary key=value
HTTP POST請求中的數據為純二進制數據
value如果是@file_name,則保留文件中的回車符和換行符,不做任何轉換
4) --data-raw key=value
@也作為普通字符串,不會作為文件名給出文件名的標志。即value如果是@file_name,只表示值為“@file_name”的字符串。
其他等價於-d
5) --data-urlencode key=value
先對數據進行URL編碼,再發送給HTTP服務器,即對表單中的字段值進行URL編碼后再發送。
為了兼容CGI,格式為“name+分隔符+content”,如下所示:
name=content,將content進行URL編碼,然后提交給HTTP服務器
=content,同上,只是未給出引用的name
content,同上,注意content中不能包含=和@符號
name@filename,從文件filename中讀取數據(包括換行符),將讀取的數據進行URL編碼,然后提交給HTTP服務器
@filename,同上
其他等價於-d
補充-F, --form選項
模擬發送表單,默認即POST,且默認Content-Type:multipart/form-data。
示例:
curl -F mykey1=myvalue1 -F mykey2=myvalue2 http://myapi.url.com curl -F myfile1=@file_name1 -F myfile1=@file_name2 http://myapi.url.com curl -X POST -H Content-Type:multipart/form-data -F myfile1=@file_name1 -F myfile1=@file_name2 http://myapi.url.com
完結!!