1. 程式人生 > 程式設計 >Cookie 的 SameSite 屬性小結

Cookie 的 SameSite 屬性小結

目錄
  • 一、CSRF 攻擊是什麼?
  • 二、SameSite 屬性
    • 2.1 Strict
    • 2.2 Lax
    • 2.3 None
  • 三、參考連結

    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 的請求。為了防止這種攻擊,表單一般都帶有一個隨iJxhYwww.cppcns.com 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

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

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

    這個規則過於嚴格,可能造成非常不好的使用者體驗。比如,當前網頁有一個 連結,使用者點選跳轉就不會帶有 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 屬性內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!