熟悉HTTP/HTTPS 等網(wǎng)絡基本知識
一 什么是協(xié)議
1.什么是協(xié)議侦镇?通信雙方預先定義好的通信規(guī)范或規(guī)則
2.HTTP協(xié)議(超文本傳輸協(xié)議)的歷史版本
HTTP / 0.9:
GET index.html
HTTP / 1.0
增加 POST
POST /index.html HTTP/1.0
If-Modified-Since 緩存相關
Authorization 身份認證
Connection 默認值close
HTTP/1.1
GET /index.html HTTP/1.1
Host 指定請求域名
Range 指定請求范圍
Connection : 默認值 是 keep-alive
請求結束后磷支,保持一段時間谜嫉。默認keep-alive以便網(wǎng)頁中嵌入的樣式等繼續(xù)使用連接沦泌。
Transfer-Encoding: chunked 分塊傳輸
二 HTTP 通信交互流程
1.URL 規(guī)范
http://
username:passwd 一般不要
@www.un.org
/subdir/file.html
?var=value&var2=value2
#hash
2.HTTP工作流程 簡要
1.輸入域名,回車
2.解析域名屁药,獲取IP, 通過DNS
3.建立TCP連接
4.向服務器發(fā)送GET請求
5.返回內容
根據(jù)conection配置看是否斷開連接于颖。
一般是
客戶端 —— 代理服務器 —— 應用服務器
三 常見的HTTP header 的含義及作用
1.fiddler 小工具 是一個http協(xié)議調試代理工具
瀏覽器抓包和調試工具
2.HTTP請求
①請求行
GET /dir/1.html HTTP/1.1
②請求頭
通用header
請求header
實體header
③請求體
3.HTTP/1.1 規(guī)范中的8個請求方法
GET URL 規(guī)范最長是255個字符,實際支持1024字符
POST 提交大塊數(shù)據(jù) 成功返回200
HEAD 檢測服務器
PUT 類似post請求消请,目的是向服務器發(fā)送允許保存的數(shù)據(jù) 成功返回201 只能通過程序或工具發(fā)送
DELETE 刪除服務器資源
TRACE 用于診斷網(wǎng)絡
OPTIONS 查詢指定資源有哪些請求方法可以使用
CONNECT 用于代理服務器和應用服務器之間
用于建立一個僅用于數(shù)據(jù)傳輸?shù)乃淼?/p>
4.請求頭
Accept:
text/html栏笆,application/xhtml+xml,application/xml; q=0.9; /;q=0.8
瀏覽器接受的內容類型
參數(shù)為 Content Type
q 指定優(yōu)先級[0-1] 0為不接受臊泰, 默認為1
如果不指定 / , 則其他類型優(yōu)先級為0蛉加;
Accept-Charset: 瀏覽器接受的字符集
utf-8;q=0.66,*;0.6
Accept-Encoding:
gzip,deflate,sdch 瀏覽器接受的壓縮格式
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
瀏覽器接受的語言
Authorization:發(fā)送身份驗證信息的
Basic
QW….Q== 用戶名和密碼的basic64編碼
如果響應指定的話
401 Unauthorized
瀏覽器就可以繼續(xù)發(fā)送請求
Cookie :
version=1;skin=new
Cache-Control: 控制緩存策略
public,max-age=86400
Host:
www.xxx.com:8080
If-Match:
“aetaghash”
類似隨機字符串缸逃,hash 僅在指定的值匹配
服務器已有內容的hash碼针饥,瀏覽器提交md5值,服務器檢查該值需频,則進行操作丁眼。
如果匹配,則執(zhí)行
If-Modified-Since:
Sun , 11 may
指定時間后昭殉,內容又被修改了苞七,則請求git, 否則返回304
If-None-Match
“aetaghash”
如果不匹配挪丢,則執(zhí)行
If-Range
“aetaghash”
Sun , 11 may
如果沒有變化蹂风,則返回指定的
檢查分段內容有沒有變化,斷點續(xù)傳乾蓬。如果沒有變化硫眨,就發(fā)送請求的,如果變了就給全部內容
If-Unmoidified-Since:
沒有變化巢块,則給到
Range: 可以發(fā)送片段請求
bytes=0-499,1000-
Referer :
http:// xxx.com
點擊頁面的url,來源
Upgrade:
HTTP/2.0
客戶端向服務器請求切換協(xié)議
2.0 規(guī)范已經出了,但是應用不廣泛
Via:
192.168.11.22巧号,ex.com
發(fā)送trace 請求時族奢,追蹤
X-Requested-With: XML
Ajax 請求時會用到,判斷AJAX請求
X-Forwarded-For:
client1,proxy1,192.168.2.125
經常用于代理服務器轉發(fā)客戶端ip地址
四 常見HTTP相應狀態(tài)碼的含義
響應行
HTTP/1.1 200 OK
響應頭
通用header丹鸿, 響應header越走,實體header
響應體
html代碼等
響應狀態(tài)碼:
100-199 :參考信息
200-299:成功 成功獲取或成功創(chuàng)建
300-399: 重定向
400-499:客戶端錯誤
500-599:服務器錯誤
常見碼
200 ok
201 已創(chuàng)建 通常put請求
206 片段內容 請求range
301 已永久移動到其他位置,通常配合Location使用
SEO適用,無結尾/請求目錄時也會自動產生此響應廊敌,盡量戴上斜線
302 Found 找到了
按HTTP規(guī)范铜跑,
304 Not Modified
未修改,無變動(用緩存中的吧)
400 Bad Request 請求錯誤
401 Unauthorized 未被授權
瀏覽器收到此響應會彈出一個輸入用戶名骡澈、密碼的對話框
403 禁止訪問 驗證失敗或重試次數(shù)過多也會導致此響應
404 Not Found
405 Method Not Allowed
訪問方法不對
服務器禁止以所請求的方法訪問锅纺,同時一般會通過Allow 告知允許的方法:
Allow: GET ,POST,HEAD
406 Not Acceptable
無法接受
當請求中的Accept系列header 中列出的條件無法滿足時,會產生此響應
408 Request timeout
請求超時
服務器一直沒遇到 connection:close 會產生此響應并關閉連接
416 Request range not satisfiable
Range請求片段無法滿足
418 i m a teapot
用茶壺煮咖啡的時候
愚人節(jié)的玩笑
500 服務器錯誤
502 bad gateway
網(wǎng)管錯誤肋殴。代理服務器從上游服務器收到一個無效響應時囤锉,會給客戶端返回此響應
503 service unavailable 服務暫不可用
如上游服務器超載或暫時停機維護等,代理服務器則返回此響應护锤」俚兀可附帶retry-after頭
通常網(wǎng)站訪問壓力大時
504 gateway timeout
網(wǎng)關超時 代理服務器無法在限定時間內從上游服務器收到一個有效響應
通常網(wǎng)站訪問壓力大時
響應header
ETag:”ab….sertag“
跟客戶端配合,檢查客戶端緩存是否超時
Location: 指定新的位置
Refresh: 指定重新刷新的時間和地址
Set-Cookie:服務器讓客戶端設置cookie
Vary 客戶端瀏覽器保存緩存時烙懦,根據(jù)這些header 存儲緩存驱入。
五 Cookie、Session 的原理
cookie 是什么?
cookie使用來跟蹤用戶會話的技術.cookie本身是一小段文本信息,它存在與http協(xié)議header頭域里,通過http協(xié)議來傳遞.
cookie 用來干什么?
http協(xié)議是一種無狀態(tài)協(xié)議,客戶端和服務端完成一次會話后,服務器端不知道下次連接到服務端的是不是同一個客戶端,需要有個標識能告訴服務端,是哪個客戶端連接上了服務端.例如登錄用戶,需要有個東西標識,那就在客戶端保存一個cookie,下次訪問的時候隨http header一起發(fā)到服務端,服務端根據(jù)cookie的內容知道了這是某個用戶的請求,服務端根據(jù)cookie取到該用戶的信息,返回給客戶端
session是什么
Session是另一種記錄客戶狀態(tài)的機制氯析,不同的是Cookie保存在客戶端瀏覽器中亏较,而Session保存在服務器上∑茄唬客戶端瀏覽器訪問服務器的時候宴杀,服務器把客戶端信息以某種形式記錄在服務器上。這就是Session拾因。
session能干什么
cookie能做的他能做,cookie不能做的他也能做!
session是怎么工作的
用戶請求login.php填寫數(shù)據(jù)后提交
服務器收到提交的數(shù)據(jù)取得用戶信息,將用戶信息存入session,并將session_id通過cookie的形式發(fā)給客戶端
客戶端將session_id存入瀏覽器cookie文件
用戶再次訪問其他頁面時,將有session_id的cookie通過header頭發(fā)給服務端
服務端拿到session_id從session中取到用戶信息并返回
問題1:session的有效期旺罢?
由php.ini 中的session配置決定(session.cookie_lifetime=0 session.gc_maxlifetime ==600 )
問題2:關閉客戶端可以刪除session或者使session失效嗎?
不能刪除session,但是有可能使session失效绢记。使其失效的原因是如果配置的session有效期是cookie隨瀏覽器失效扁达。
問題3:
如果瀏覽器不支持cookie,session能正常使用嗎蠢熄?
可以跪解,將session通過url傳遞
問題4:
如果服務器有多臺服務器,session如何共享签孔?
nfs 將多臺服務器所在的session存儲目錄設為mount掛載的目錄
memcache session.save_handle=memcache并設置路徑session_path = ‘tcp://192.168.1.101:11211’
mysql session.save_handler=user 叉讥,然后建立session表,建立php文件用于對數(shù)據(jù)庫表操作session數(shù)據(jù)饥追,最后用session的都引入上一步中的php文件
六 HTTP緩存策略
性能優(yōu)化
緩存 Cache-control图仓、 If-Modified-Since、ETag
Cache-Control: max-age=600, no-cache="Set-Cookie"
no-cache="xxx":緩存但绕,但在發(fā)回客戶端前先作檢查救崔,傳值則表示不緩存指定的header
no-store:不緩存任何內容惶看,在IE中=no-cache。
max-age=120: 緩存最大有效期六孵,秒(Age response header)
max-stale=600:在緩存過期后還可以繼續(xù)保存600秒纬黎,不賦值則表示可一直有效
no-transform:禁止緩存代理修改內容
only-if-cached: 禁止緩存代理訪問應用服務器,僅在有緩存時返回內容劫窒。
public: 任何客戶端(代理服務器或瀏覽器)均可緩存
private: 僅限私有客戶端(一般是瀏覽器)可緩存內容
must-revalidate: 必須重新驗證緩存有效性(默認行為)本今,此指令目的在于顯式指明
proxy-revalidate:代理服務器需要重新驗證緩存有效性,瀏覽器不需要
s-maxage:指定public客戶端上的maxage烛亦,private 上忽略诈泼。
第一次請求,服務器響應:
Last-Modified: 時間A
第二次請求煤禽,附加 header铐达,檢查是否從上次修改時間點后又有過新的修改:
If-Modified-Since: 時間A
ETag:
If-None-Match:
Vary: Accept-Encoding
告知緩存代理服務器,客戶端請求中發(fā)送了不同的 Accept-Encoding 就要緩存不同的版本
Vary: User-Agent 合理嗎? back
連接
Connection: keep-alive
Keep-Alive: 10
壓縮
Accept-Encoding檬果、Content-Encoding
ob_start("ob_gzhandler");
片段請求
Range: bytes=0-1023
分塊傳輸
Transfer-Encoding: chunked
七 HTTP安全瓮孙、常見攻擊方式及防范策略
XSS 跨站腳本共計
被攻擊的網(wǎng)站上注入了可執(zhí)行的js,通過js盜取cookie选脊,發(fā)送到第三方網(wǎng)站
CRSF 跨站請求偽造
在用戶不知情的情況下杭抠,通過第三方網(wǎng)站插入圖片或JS提交POST請求的方式執(zhí)行有害操作
POST 請求帶hash值來防止
Sniffer 嗅探
各種監(jiān)聽、假冒
HTTP和HTTPS
HTTP原先 直接建立在tcp協(xié)議上
HTTPS 建立在ssl協(xié)議上,當然ssl協(xié)議也是建立在tcp協(xié)議上
SSL協(xié)議的工作流程
客戶端向服務器請求獲取證書+公鑰
客戶端通過CA驗證收到證書的合法性
客戶端通過收到的公鑰加密一個字符串恳啥,作為后續(xù)通信密鑰偏灿,發(fā)送給服務器
服務器通過私鑰解密,得到通信密鑰
后續(xù)HTTP協(xié)議通過通信密鑰加密進行
八 PHP中HTTP相關應用實戰(zhàn)
使用 fsockopen 函數(shù)來模擬實現(xiàn)HTTP協(xié)議
或curl擴展