- 前言
- 請求資料格式
- 請求行
- 請求方法
- 請求頭
- Accept
- Referer
- User-Agent
- HOST
- X_FORWARDED_FOR
- Content-Type
- Content-Length
- Transfer-Encoding
- Cookie
- Connection
- Accept-Encoding
- Accept-Language
- Upgrade-Insecure-Requests
- Cache-Control
- If-Modified-Since
- If-None-Match
- 空行
- 請求行
- 響應資料格式
- 響應行
- 狀態碼
- 常見狀態碼
- 響應頭
- Date
- Server
- X-Powered-By
- Expires
- Cache-Control
- Pragma
- Connection
- Content-Type
- Content-Length
- Set-Cookie
- Strict-Transport-Security(HSTC)
- X-Frame-Options
- X-Ua-Compatible
- 空行
- 響應正文
- 響應行
前言
近來常思,不應止步於此,可自覺進階緩慢,一籌莫展,就打算自廢武功複習一下,那就從狀態碼開始吧。
由於強迫症患者,所以後面就順便把資料包格式啥的都一起寫一下吧。
請求資料格式
四部分
- 請求行
- 請求頭
- 空行
- 請求資料(正文)
請求行
每個請求資料包第一行即為請求行,格式如下
請求方式+空格+uri+空格+協議/協議版本
例子:GET / HTTP/1.1
請求方法
常用:
GET、POST、HEAD、
PUT、PATCH、OPTIONS、
DELETE、CONNECT、TRACE
其中最常用的:GET、POST
-
POST與GET
通常GET用來請求資源拿資源,畢竟名字都叫GET了
POST通常用來提交資料,也用來請求資源,POST的方式更為隱藏,提交的資料不會在瀏覽器位址列顯示出來也更為安全。 -
HEAD
與GET一樣,只不過伺服器不會傳回資源,用於獲取報頭。 -
PUT
向指定資源位置上傳最新內容,主要用於上傳檔案,更新整體資料。 -
PATCH
更新區域性資源 -
DELETE
請求伺服器刪除請求中所標識的資源 -
CONNECT
HTTP/1.1協議中預留給能夠將連線改為管道方式的代理伺服器。 -
OPTIONS
可使伺服器傳回該資源所支援的所有HTTP請求方法。通常在響應頭ALLOW中。 -
TRACE
回顯伺服器收到的請求,主要用於測試或診斷。
請求頭
Accept
表示瀏覽器支援的 MIME 型別
text/html,application/xhtml+xml,application/xml;q=0.9
斜槓前面的是 type(型別),斜槓後面的是 subtype(子型別);
q表示權重,比如上面application/xml;q=0.9:
表示這個型別瀏覽器渲染型別權重佔0.9,其他沒有寫就預設為1。
Referer
用於防盜鏈、防CSRF
請求該網站的時候判斷是否是白名單內轉過來的,否則判斷為空手套白狼,比如你從某xxx網站想直接跳轉到百度某個後臺,百度後臺用referer做了限制,那麼你肯定跳轉失敗。
User-Agent
顯示的都是客戶端自己的相關資訊,比如你的客戶端瀏覽器是什麼型號,你的客戶端使用的作業系統是什麼等等
所以有的時候有些伺服器會對UA與資料庫進行互動,那麼UA也會造成SQL隱碼攻擊
HOST
服務端的域名或IP
X_FORWARDED_FOR
簡稱XFF,通常是服務端用來獲取使用者真實IP的,但是可以修改請求包偽造真實IP。
Content-Type
三種格式可選
- application/x-www-form-urlencoded
這個就是普通的引數文字格式
- multipart/form-data
主要用於上傳檔案使用的格式(分塊傳輸)
- application/json
鍵值對
{"id":1,"name":"whoisdhan"}
Content-Length
記錄資料部分佔多少位元組
(可以找到一些中介軟體的溢位漏洞,比如2024年的tomcat溢位漏洞)
Transfer-Encoding
在Content-Length不確定的時候可以使用:
Transfer-Encoding:chunked
chunked分塊傳輸,也就是說當你設定這個的時候你的Content-Length會失效。
同時chunked分塊傳輸有時候可以有效的bypass過waf
Cookie
沒啥好說的,cookie、session、token等各種認證機制都是涉及安全以及連線狀態等等
Connection
Keep-Alive表示短連結,也就是建立的連線需要維持一段
Close表示關閉連線,一次請求一次相應,這是http的方式。
Accept-Encoding
通常指定壓縮方法,是否支援壓縮,支援什麼壓縮方法
這能夠加大傳輸效率,否則一張大圖每次都要傳輸很久。
Accept-Language
語言跟字符集的區別:中文是語言,中文有多種字符集,比如big5,gb2312,gbk等等
Upgrade-Insecure-Requests
讓瀏覽器自動升級請求從http到https。這個理解為一個網站有http也有https,但是為了不報錯,自動讓瀏覽器升級請求為https。
所以有時候有的我們請求http但是也會自動給你升級為https。
Cache-Control
Cache快取相關,就是快取控制相關。
- 常見值(預設為private)有:
private、no-cache、max-age、must-revalidate等。
最貼切的解釋就是當你訪問網頁想要後退的時候他就發揮作用了:
- 1、開啟新視窗
值為private、no-cache、must-revalidate,那麼開啟新視窗訪問時都會重新訪問伺服器。而如果指定了max-age值(單位為秒),那麼在此值內的時間裡就不會重新訪問伺服器,
例如:
Cache-control: max-age=5
(表示當訪問此網頁後的5秒內再次訪問不會去伺服器) - 2、在位址列回車
值為private或must-revalidate則只有第一次訪問時會訪問伺服器,以後就不再訪問。
值為no-cache,那麼每次都會訪問。
值為max-age,則在過期之前不會重複訪問。 - 3、按後退按扭
值為private、must-revalidate、max-age,則不會重訪問,
值為no-cache,則每次都重複訪問 - 4、按重新整理按扭
無論為何值,都會重複訪問
If-Modified-Since
modified就是修改的意思
把瀏覽器端快取頁面的最後修改時間傳送到伺服器去,伺服器會把這個時間與伺服器上實際檔案的最後修改時間進行對比
- 如果時間一致,那麼返回304,從你上次get的快取中取。
- 不一致,返回200且丟棄舊檔案快取,伺服器中給你返回新的。
If-None-Match
match匹配的意思
這裡會和ETag一起使用
工作原理:
請求中攜帶:
If-None-Match:ETag值
服務端收到ETag後會校驗是否改變,如果和伺服器現在的ETag不一樣的話就返回200以及新檔案
否則就返回304,讓瀏覽器拿本地快取檔案。
空行
用來讓請求行和請求頭與資料部分分開
響應資料格式
響應行
協議/版本+空格+狀態碼+空格+狀態描述
例子:HTTP/1.1 200 OK
狀態碼
五大類
1xx訊息——請求已被伺服器接收,繼續處理
2xx成功——請求已成功被伺服器接收、理解、並接受
3xx重定向——需要後續操作才能完成這一請求
4xx客戶端請求錯誤——請求含有詞法錯誤或者無法被執行
5xx伺服器錯誤——這些狀態碼錶示伺服器在嘗試處理請求時發生內部錯誤。這些錯誤是伺服器本身的錯誤,而不是請求的錯誤
常見狀態碼
- 1開頭(資訊類Informational)
100 (Continue/繼續)接受的請求正在處理,資訊類狀態碼
101 (Switching Protocols/轉換協議)
- 2開頭(成功類)
200 (Success)伺服器已成功處理了請求。
201 (Created/已建立),比如訂閱收藏可以用
202 (Accepted/接受)已接受請求,但尚未處理
204 (No Content/無內容)請求處理成功,但沒有任何資源可以返回給客戶端。返回204狀態碼這裡經常會被漏掃工具誤報成漏洞。
- 3開頭(重定向Redirection)
301 (Moved Permanently)永久性重定向,表示資源已被分配了新的 URL
302 (Found/找到)臨時性重定向,服務端臨時維護用了重定向可能就需要302,或者一些後臺會302重定向不讓人進。
303 (See Other/參見其他資訊)這個狀態碼和 301、302 相似。如果最初的請求是 POST,那麼新文件(在定位頭資訊中給出)要用 GET 找回。這個狀態碼是新加入HTTP 1.1中的。基本用302的多。
304 (Not Modified/未修改)自從上次請求後,請求網頁未修改過,就是上面If-Modified-Since會出現返回的狀態碼。
- 4開頭(客戶端錯誤Client Error)
400 (Bad Request/錯誤請求)伺服器不理解請求的語法
401 (Unauthorized/未授權)表示傳送的請求需要有透過HTTP認證的認證資訊,客戶端在授權頭資訊中沒有有效的身份資訊時訪問受到密碼保護的頁面。這個在api批次跑的時候經常有。
403 (Forbidden/禁止)伺服器拒絕請求,不允許訪問。
404 (Not Found/未找到)伺服器找不到請求網頁
405 (Method Not Allowed/方法未允許),請求的方法不允許,換請求方法
406 (Not Acceptable/無法訪問)表示請求資源的MIME型別與客戶端中Accept頭資訊中指定的型別不一致。
- 5開頭(伺服器錯誤Server Error)
500 (Internal Server Error/內部伺服器錯誤)表示伺服器遇到錯誤,可能是web應用存在bug或某些臨時崩潰了
501 (Not Extended/尚未實施) 表示伺服器不支援當前請求所需要的某個功能。
502 (Bad Gateway/錯誤的閘道器)表示伺服器作為閘道器或代理,從上游伺服器收到無效響應。
503 (Service Unavailable/服務無法獲得)表示伺服器處於停機維護或超負載,無法正常響應(看到這個別擔心,沒人給你打電話就別慌)
504 (Gateway Timeout/閘道器超時) Timeout
505 (HTTP Version Not Supported/HTTP 版本不受支援)伺服器不支援你請求所用的協議
506 (Variant Also Negotiates/變體協商)表示伺服器存在內部配置錯誤
507 (Insufficient Storage/儲存錯誤)表示伺服器無法儲存完成請求所必須的內容。一般是資料庫出問題時會看到這個狀態碼
響應頭
Date
服務端傳送資源時的伺服器時間
Date: Thu, 09 Dec 2024 06:40:25 GMT
GMT是格林尼治所在地的標準時間。
Server
web伺服器和相對應的版本,只是告訴客戶端伺服器資訊
X-Powered-By
告知網站是用何種語言或框架編寫的。
注:不是Apache或者Nginx輸出的
滲透的時候留意這個可以識別指紋
Expires
Expires:Thu, 19 Nov 1981 08:52:00
告訴客戶端在這個時間前,可以直接訪問快取副本
可能導致服務端與客戶端時間不一致問題,
有Cache-Control:max-age=* 比較準確,因為是相對時間
Cache-Control
Cache-Control:private 預設為private 響應只能夠作為私有的快取,不能再使用者間共享
Cache-Control:public 瀏覽器和快取伺服器都可以快取頁面資訊。
Cache-Control:must-revalidate 對於客戶機的每次請求,代理伺服器必須向伺服器驗證快取是否過時。
Cache-Control:no-cache 瀏覽器和快取伺服器都不應該快取頁面資訊。
Cache-Control:max-age=10 是通知瀏覽器10秒之內不要煩我,自己從緩衝區中重新整理。
Cache-Control:no-store 請求和響應的資訊都不應該被儲存在對方的磁碟系統中。
Pragma
表明本次請求不想獲取快取,要給我最新的響應內容,pragma:no-cache和cache-control:no-control一樣
pragma:no-cache
Connection
Connection: close 表示本次響應完成之後斷開連線
Content-Type
Content-Type:text/html;charset=UTF-8 告訴客戶端,資原始檔的型別,還有字元編碼,客戶端透過utf-8對資源進行解碼,然後對資源進行html解析。
如果能看到瀏覽器解析亂碼了,可以嘗試抓響應包修改Content-Type欄位
Content-Length
響應正文的資料大小(位元組單位)
Set-Cookie
服務端設定cookie,瀏覽器根據該欄位設定cookie,下次發包攜帶上。
Strict-Transport-Security(HSTC)
表示只能HTTPS訪問當前資源, 禁止HTTP方式。
Strict-Transport-Security: max-age=172800;includeSubDomains
解釋:
- max-age=172800設定在瀏覽器收到這個請求後的 172800 秒的時間內凡是訪問這個域名下的請求都使用 HTTPS 請求。
- includeSubDomains是可選的,若含有該值,那麼說明此規則也適用於該網站的所有子域名,即: 其他子域名在172800 秒的時間內的請求都使用 HTTPS 請求。
X-Frame-Options
iframe標籤可以載入網站,如果我們網站加上了X-Frame-Options,那就無法被別人載入進壞人的站點裡面了。
修改web伺服器配置,新增X-frame-options響應頭。賦值有如下三種:
(1)DENY:不能被嵌入到任何iframe或frame中。
(2)SAMEORIGIN:頁面只能被本站頁面嵌入到iframe或者frame中。
(3)ALLOW-FROM uri:只能被嵌入到指定域名的框架中。
X-Ua-Compatible
該響應頭主要是為了相容IE8瀏覽器渲染問題出現的
- IE=Edge,chrome=1:
IE8要按照Edge瀏覽器的方式渲染頁面,chrome=1是將允許站點在使用了谷歌瀏覽器內嵌框架(Chrome Frame)的客戶端渲染,對於沒有使用的,則沒有任何影響。大多數國產瀏覽器都是有谷歌內嵌的,所以建議預設加上
空行
用來讓響應行和響應頭與響應資料部分分開
響應正文
這裡也沒啥好說的,服務端給你啥就是啥
正文結束,感謝各位道友看完鄙人的拙筆劣文。