?
本文檔使用 php中文網(wǎng)手冊 發(fā)布
HTTP為訪問控制和身份驗證提供了一個通用框架。最常見的HTTP認證方案是“基本”認證。本頁面介紹了一般HTTP驗證框架,并展示了如何使用HTTP基本驗證來限制對服務器的訪問。
RFC 7235定義了HTTP認證框架,服務器可以使用該框架挑戰(zhàn)客戶端請求,并由客戶端提供認證信息。挑戰(zhàn)和響應流程如下所示:服務器響應具有401
(未授權)響應狀態(tài)的客戶端,并提供有關如何使用WWW-Authenticate
至少包含一個挑戰(zhàn)的響應標頭進行授權的信息。然后,想要使用服務器進行身份驗證的客戶端可以通過Authorization
在憑證中包含請求標頭字段來完成此操作。通常,客戶端會向用戶顯示密碼提示,然后發(fā)出包含正確Authorization
標題的請求。
在如圖所示的“基本”認證的情況下,交換必須通過HTTPS(TLS)連接進行以確保安全。
代理驗證可以使用相同的質詢和響應機制。在這種情況下,它是需要認證的中間代理。由于資源認證和代理認證可以共存,因此需要一組不同的標題和狀態(tài)代碼。對于代理服務器,具有挑戰(zhàn)性的狀態(tài)代碼是407
(需要代理服務器認證),Proxy-Authenticate
響應標頭至少包含一個適用于代理服務器的挑戰(zhàn),并且Proxy-Authorization
請求標頭用于向代理服務器提供憑證。
如果(代理)服務器接收到的有效憑證不足以獲取給定資源的訪問權限,則服務器應該使用403
Forbidden
狀態(tài)代碼進行響應。不像401
Unauthorized
或者407
Proxy Authentication Required
,這個用戶不可能進行身份驗證。
WWW-Authenticate
and Proxy-Authenticate
headersWWW-Authenticate
和Proxy-Authenticate
響應標頭定義應該被用來獲得對資源的訪問的驗證方法。他們需要指定使用哪種認證方案,以便希望授權的客戶端知道如何提供憑證。這些標題的語法如下所示:
WWW-Authenticate: <type> realm=<realm>Proxy-Authenticate: <type> realm=<realm>
這里<type>
是認證方案(“基本”是最常見的方案,下面介紹)。該領域用于描述保護區(qū)域或指示保護范圍。這可能是“訪問登臺站點”或類似消息,以便用戶知道他們試圖訪問哪個空間。
Authorization
和Proxy-Authorization
標題所述Authorization
和Proxy-Authorization
請求報頭包含憑證與一個(代理)服務器進行認證的用戶代理。在此,需要再次輸入憑證,憑證可以根據(jù)使用的認證方案進行編碼或加密。
Authorization: <type> <credentials>Proxy-Authorization: <type> <credentials>
一般的HTTP認證框架被多個認證方案使用。方案可以在安全強度和客戶端或服務器軟件的可用性方面有所不同。
最常見的認證方案是下面更詳細介紹的“基本”認證方案。IANA維護認證方案列表,但還有其他由主機服務提供的方案,例如Amazon AWS。常見的認證方案包括:
基本(請參閱RFC 7617,base64編碼憑證,請參閱下面的更多信息。),
承載(請參閱RFC 6750,承載令牌訪問受OAuth 2.0保護的資源),
摘要(請參閱RFC 7616,F(xiàn)irefox中只支持md5散列,請參閱SHA加密支持的bug 472823),
HOBA(參見RFC 7486(草案),? TTP ? rigin- 乙 ound 甲 uthentication,數(shù)字簽名系),
相互(見draft-ietf-httpauth-mutual),
AWS4-HMAC-SHA256(請參閱AWS文檔)。
“基本”HTTP身份驗證方案在RFC 7617中定義,該身份驗證方案將憑據(jù)作為用戶ID /密碼對發(fā)送,并使用base64進行編碼。
由于用戶標識和密碼以明文形式傳遞(它是base64編碼,但base64是可逆編碼),因此基本認證方案不安全。HTTPS / TLS應與基本認證一起使用。如果沒有這些額外的安全增強功能,則不應使用基本身份驗證來保護敏感或有價值的信息。
要在Apache服務器上密碼保護目錄,您需要一個.htaccess
和一個.htpasswd
文件。
該.htaccess
文件通常如下所示:
AuthType Basic AuthName "Access to the staging site"AuthUserFile /path/to/.htpasswd Require valid-user
該.htaccess
文件引用一個.htpasswd
文件,其中每行包含由冒號(“:”)分隔的用戶名和密碼。您看不到加密的實際密碼(本例中為md5)。請注意,.htpasswd
如果您喜歡,您可以以不同的方式命名文件,但請記住,任何人都無法訪問此文件。(Apache通常配置為阻止訪問.ht*
文件)。
aladdin:$apr1$ZjTqBB3f$IF9gdYAGlMrs2fuINjHsz.user2:$apr1$O04r.y2H$/vEkesPhVInBByJUkXitA/
對于nginx,你將需要指定一個你將要保護的位置,以及auth_basic
為密碼保護區(qū)域提供名稱的指令。auth_basic_user_file
然后該指令指向包含加密用戶憑證的.htpasswd文件,就像上面的Apache示例一樣。
location /status { auth_basic "Access to the staging site"; auth_basic_user_file /etc/apache2/.htpasswd;}
許多客戶端還可以通過使用包含用戶名和密碼的編碼URL避免登錄提示:
https://username:password@www.example.com/
這些URL的使用已被棄用。在Chrome中,出于安全原因username:password@
,URL中的部分甚至被刪除。在Firefox中,檢查網(wǎng)站是否實際需要身份驗證,如果不是,F(xiàn)irefox會提示用戶提示“您將用用戶名”username“登錄到網(wǎng)站”www.example.com“,但是網(wǎng)站不需要認證,這可能是企圖誘騙你?!?/p>
WWW-Authenticate
Authorization
Proxy-Authorization
Proxy-Authenticate
401
, 403
, 407