主頁 > 企業開發 > Cookie SameSite屬性介紹及其在ASP.NET專案中的應用

Cookie SameSite屬性介紹及其在ASP.NET專案中的應用

2020-09-16 08:30:54 企業開發

一、Cookie SameSite屬性介紹

就像大家已經知道的,一旦設定Cookie之后,在Cookie失效之前瀏覽器會一直將這個Cookie在后續所有的請求中都傳回到Server端,我們的系統會利用Cookie這個特性做很多事情,但通常我們會在Cookie中存放加密的用戶身份,在Server端根據此身份檢驗用戶是否有權限進行相應操作,

發送Cookie時,以往瀏覽器并不檢測當前地址欄上的域(Domain)是不是和這個Cookie所屬的域是否相同,惡意用戶會利用這個問題巧妙設計一個站點,誘導用戶點擊從而造成跨站點請求偽造攻擊(CSRF),

為了解決這個問題,國際互聯網工程任務組(IETF)提出了一個SameSite的草稿標準,Chrome 51開始支持此功能,但從Chrome 80 Stable版本開始啟用一個較嚴格(Lax)的默認設定,

二、什么是跨站點請求偽造攻擊(Cross-Site Request Forgery Attack,CSRF)

CSRF攻擊簡單而言就是惡意用戶通過巧妙偽造請求從而盜用合法用戶的身份進行惡意操作,

比如你開發了一個非常厲害的系統,系統中某些操作只有特定的人登錄之后才有權限使用:

yourdomain.com/snap

[Authorize("Thanos")]
[HttpPost]
public ActionResult Snap()
{
    ///dangerous, will destroy the world.
}

因為系統要檢驗身份和權限,除非惡意用戶能破解登錄系統以Thanos身份登錄,否則是沒有辦法呼叫這個方法的,

但是惡意用戶可以偽造一個像下面這樣的頁面,惡意用戶通過發郵件或者通過跨站點腳本攻擊(XSS)等方式誘導具有權限的用戶點擊頁面上的某些Button,如果具有權限的用戶剛好已經登錄,一旦點擊按鈕,系統則會以這個用戶的身份觸發上面危險的操作Snap(),

malicioususer.com/fancypage

...
<form action="yourdomain.com/snap">
    <input type="Submit" value=https://www.cnblogs.com/wxx/p/"This is cool, click me"/>

...

當然,微軟 ASP.NET是通過AntiForgeryToken來解決這個問題,不過這個不是這篇blog討論的主題,

三、Cookie的SameSite屬性

為了解決上面到的Cookie的安全問題,Chrome從版本51增加了一個新的Cookie屬性SameSite, 以控制Cookie是否能在跨站點的情況下傳送,

Cookie所屬的域名如果和瀏覽器地址欄中的域名不一致,則認為是跨站點,另外,當你的站點被iframe嵌在第三方站點時也被認為是跨站點,

這個屬性有三個屬性值:

  1. None

    如果你需要在任意跨站點情況下都使用某個Cookie,則需要將這個Cookie的SameSite設定為None. 但這里需要注意的是一定要同時設定Cookie的Secure,也就是需要使用https訪問時才能關閉SameSite功能. 如果沒有標明為secure, Chrome 80及以上會拒絕設定這個Cookie,

    set-cookie: samesite=test; path=/; secure; SameSite=None
    
  2. Strict

    顧名思義,這是嚴格模式,就是在任何情況下都不允許跨站點發送Cookie,

    這個設定顯然是可以解決上面所提到的CSRF問題,因為當訪問 malicioususer.com/fancypage 頁面時,當前域是 malicioususer.com, 但user點擊button提交時的action是指向另外一個域 yourdomain.com,這是兩個不同的域,瀏覽器將不回傳yourdomain.com下面的Cookie,這會極大的提高我們系統的安全性,

    但這個嚴格模式也限制了一些被認為是安全的鏈接操作,比如:

    1. 你先登錄了公司HR系統,假設該系統將所有Cookie的SameSite都設定為strict.
    2. 你用Web郵件系統收到了要求你到HR系統做審批操作的郵件,這封郵件帶了一個link,直接鏈接到HR系統中審批的頁面;
    3. 你點擊這個link,但因為Cookie被設定為Strict模式,當到達審批頁面時,HR系統沒有收到任何Cookie,這時會認為你沒有登錄,而直接跳轉到登錄頁面,在要求不是非常嚴格的情形下,可以認為這不是我們所期望的行為,因為只是跳到鏈接指向的頁面并不是像POST操作修改資料,這需要通過下面的Lax屬性解決這個問題,
  3. Lax

    Lax是比Strict稍寬松的模式,如果我們要允許跨站點鏈接傳Cookie或FORM用GET Method提交時跨站點傳Cookie, 則可以將這些Cookie的SameSite設定為Lax. Lax在Chrome 80成為默認設定,Lax既防止了CSRF也確保了正常的跨站點鏈接,是適合大多數站點的,可以解決上面HR系統安全中提到問題,

    如果你的站點需要被iframe嵌套在第三方站點,這時你還是需要將Cookie設定為None,

    這里也想到一點是,如果你的MVC Action只期望接受POST方法,那么一定要加上HttpPost Attribute,以避免造成意外的安全問題,

四、瀏覽器兼容性

如下圖示目前主流瀏覽器都已經支持SameSite,雖然 IE 11不支持,但我測驗之后發現這個Cookie本身還是沒有丟失,只是缺失了安全保護功能,
https://developer.mozilla.org/en-US/docs/Web/HTTP/headers/Set-Cookie#Browser_compatibility
Browser Compabibility

五、如何修改ASP.NET程式

下面總結的步驟是適用于基于ASP.NET開發的系統,微軟官方白皮書對這些屬性設定做了詳細的說明,也可以參考官方白皮書,

  1. .NET Framework 4.7.2 或4.8才開始支持SameSite, 在HttpCookie增加了SameSite的屬性,所以需要安裝.NET Framework 4.7.2以上SDK, 并且需要安裝開發電腦和服務器上,

  2. 安裝 Windows 2019/11/19累積更新補丁,請見KB Articles that support SameSite in .NET Framework,也需要安裝在開發電腦和服務器上,沒有安裝這個補丁之前,如果SameSite為None, .NET Framework并不輸出這個屬性到Broswer, 但Chrome 80及以后將未設定默認為Lax,因此造成不一致的行為,所以需要安裝這個補丁以明確輸出None,

  3. 在Chrome地址欄輸入: chrome://flags/, 將下面兩項設定為Enabled,開啟這兩項設定是因為不是所有的Chrome都默認啟用了這兩項設定,Chrome只是在逐漸將這兩項開啟到Chrome的user. 所以開發時為了重現問題,最好是顯式開啟,
    chrome://flags/#same-site-by-default-cookies
    chrome://flags/#cookies-without-same-site-must-be-secure
    Enable Chrome SameSite explicitly

  4. 修改專案檔案屬性, Target framework 4.7.2 或4.8,
    target .net 4.7.2 or above

  5. 根據需要修改web.config對Cookie的SameSite設定,

    <configuration>
        <system.web>
            <httpCookies sameSite="[Strict|Lax|None|Unspecified]" requireSSL="[true|false]" />
            <anonymousIdentification cookieRequireSSL="false" /> <!-- No config attribute for SameSite -->
            <authentication>
                <forms cookieSameSite="Lax" requireSSL="false" />
            </authentication>
            <sessionState cookieSameSite="Lax" /> <!-- No config attribute for Secure -->
            <roleManager cookieRequireSSL="false" /> <!-- No config attribute for SameSite -->
        <system.web>
    <configuration>
    

    修改說明:

    • httpCookies節點中的sameSite設定會影響系統中所有未指定sameSite Cookie的值, 但不覆寫forms/sessionState中設定的SameSite屬性,

    • forms authentication的sessionState的默認Lax模式應該能滿足常規需要, 并且保證網站的安全.

    • 確實需要接受跨站點Cookie, 比如你的網站會嵌套在第三方網站的iframe里面,則需要將相關的Cookie 的SameSite改為None,需要注意的是為None的時候必須要將requireSSL改為true:

      <configuration>
          <system.web>
              <httpCookies sameSite="None" requireSSL="true" />
              <authentication>
                  <forms cookieSameSite="None" requireSSL="true" />
              </authentication>
              <sessionState cookieSameSite="None" />
              <roleManager cookieRequireSSL="false" />
          <system.web>
      <configuration>
      
    • Cookie的SameSite都設定為None之后,需要防范CSRF. ,比如使用AntiForgeryToken,

  6. 如果某些Cookie需要使用與web.config中配置的不同SameSite屬性,只需要在設定Cookie的時候明確指定其值.

         var cookie = new HttpCookie("samesite", "test");
         cookie.SameSite = SameSiteMode.None;
         cookie.Secure = true;
         Response.Cookies.Add(cookie);
    
  7. 因為有些老的瀏覽器并不支持SameSite這個屬性,直接輸出這個屬性會造成老的瀏覽器忽略這個Cookie而造成Cookie丟失,請見已知的兼容問題. 如果確實需要支持這些老的瀏覽器,則需要根據user agent來檢測瀏覽器,對于不支持SameSite的瀏覽器,我們需要將SameSite設定為(SameSiteMode)(-1).

    private void CheckSameSite(HttpContext httpContext, HttpCookie cookie)
    {
        if (cookie.SameSite == SameSiteMode.None)
        {
            var userAgent = httpContext.Request.UserAgent;
            if (BrowserDetection.DisallowsSameSiteNone(userAgent))
            {
                cookie.SameSite = (SameSiteMode)(-1);
            }
        }
    }
    

    BrowserDetection.DisallowsSameSiteNone()這個方法請見SampleSiteSupport.cs.

對于ASP.NET Core應用,微軟也提供了詳細的解決方案,

六、如何排查SameSite問題

SameSite默認為Lax已經從Chrome 80 Stable正式開始灰度啟用,如果一個Cookie SameSite未指定,將會被默認為Lax,這可能會造成網站在某些情況下不能正常作業,
Chrome Developer Tools專門為SameSite問題提供了一個檢測工具,在Network tab下有一個選項"Only show requests with SameSite issues". 找到有問題的request之后,可以在Response Headers下面找到哪個Cookie有問題,如下圖示,因為我設定了SameSite為None,但沒有設定Secure,所以Chrome會拒絕這個Cookie.

find which request and then cookie has the SameSite issues

set-cookie: samesite=test; path=/; SameSite=None

在除錯的時候如果有些跳轉操作,為了看到跳轉前后的請求記錄,可以勾中Preserve log

七、參考

MDN web docs: Set-Cookie

Chrome SameSite Updates

Cookies default to SameSite=Lax

Reject insecure SameSite=None cookies

Work with SameSite cookies in ASP.NET

Work with SameSite cookies in ASP.NET Core

作者:吳秀祥
2020/3/28

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/55496.html

標籤:Html/Css

上一篇:css3實作滑鼠移入圖片動效

下一篇:大氣漂亮美觀的三個網站后臺資料管理模板 大大提升你的開發效率

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more