Cookie 的 SameSite 屬性小結

一、CSRF 攻擊是什麼?

Cookie 往往用來存儲用戶的身份信息,惡意網站可以設法偽造帶有正確 Cookie 的 HTTP 請求,這就是 CSRF 攻擊。

舉例來說,用戶登陸瞭銀行網站your-bank.com,銀行服務器發來瞭一個 Cookie。

Set-Cookie:id=a3fWa;

用戶後來又訪問瞭惡意網站malicious.com,上面有一個表單。

<form action="your-bank.com/transfer" method="POST">
  ...
</form>

用戶一旦被誘騙發送這個表單,銀行網站就會收到帶有正確 Cookie 的請求。為瞭防止這種攻擊,表單一般都帶有一個隨機 token,告訴服務器這是真實請求。

<form action="your-bank.com/transfer" method="POST">
  <input type="hidden" name="token" value="dad3weg34">
  ...
</form>

這種第三方網站引導發出的 Cookie,就稱為第三方 Cookie。它除瞭用於 CSRF 攻擊,還可以用於用戶追蹤。

比如,Facebook 在第三方網站插入一張看不見的圖片。

<img src=”facebook.com” style=”visibility:hidden;”>

瀏覽器加載上面代碼時,就會向 Facebook 發出帶有 Cookie 的請求,從而 Facebook 就會知道你是誰,訪問瞭什麼網站。

二、SameSite 屬性

Cookie 的SameSite屬性用來限制第三方 Cookie,從而減少安全風險。

它可以設置三個值。

  • Strict
  • Lax
  • None

2.1 Strict

Strict最為嚴格,完全禁止第三方 Cookie,跨站點時,任何情況下都不會發送 Cookie。換言之,隻有當前網頁的 URL 與請求目標一致,才會帶上 Cookie。

Set-Cookie: CookieName=CookieValue; SameSite=Strict;

這個規則過於嚴格,可能造成非常不好的用戶體驗。比如,當前網頁有一個 GitHub 鏈接,用戶點擊跳轉就不會帶有 GitHub 的 Cookie,跳轉過去總是未登陸狀態。

2.2 Lax

Lax規則稍稍放寬,大多數情況也是不發送第三方 Cookie,但是導航到目標網址的 Get 請求除外。

Set-Cookie: CookieName=CookieValue; SameSite=Lax;

導航到目標網址的 GET 請求,隻包括三種情況:鏈接,預加載請求,GET 表單。詳見下表。

請求類型 示例 正常情況 Lax
鏈接 <a href=”…” rel=”external nofollow” rel=”external nofollow” ></a> 發送 Cookie 發送 Cookie
預加載 <link rel=”prerender” href=”…” rel=”external nofollow” rel=”external nofollow” /> 發送 Cookie 發送 Cookie
GET 表單 <form method=”GET” action=”…”> 發送 Cookie 發送 Cookie
POST 表單 <form method=”POST” action=”…”> 發送 Cookie 不發送
iframe <iframe src=”…”></iframe> 發送 Cookie 不發送
AJAX $.get(“…”) 發送 Cookie 不發送
Image <img src=”…”> 發送 Cookie 不發送

設置瞭StrictLax以後,基本就杜絕瞭 CSRF 攻擊。當然,前提是用戶瀏覽器支持 SameSite 屬性。

2.3 None

Chrome 計劃將Lax變為默認設置。這時,網站可以選擇顯式關閉SameSite屬性,將其設為None。不過,前提是必須同時設置Secure屬性(Cookie 隻能通過 HTTPS 協議發送),否則無效。

下面的設置無效。

Set-Cookie: widget_session=abc123; SameSite=None

下面的設置有效。

Set-Cookie: widget_session=abc123; SameSite=None; Secure

三、參考鏈接

  • Using the Same-Site Cookie Attribute to Prevent CSRF Attacks
  • SameSite cookies explained
  • Tough Cookies, Scott Helme
  • Cross-Site Request Forgery is dead!, Scott Helme

到此這篇關於Cookie 的 SameSite 屬性的文章就介紹到這瞭,更多相關Cookie SameSite 屬性內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: