新專案要嵌入之前的一個專案,而且該被嵌入專案之前提供給第三方使用,他們也是用的iframe,以前都是好的,但是現在發現要是iframe的地址和父級的地址不同源,專案登錄時無法設定cookie,
一開始以為后端出問題了,后來換火狐、ie edge 都是可以的,并且其他人的Chrome也有可以用的,
并且介面設定cookie時提示:“this set-cookie didnot specify a "sameSite" attribute and was defaulted to "sameSite=Lax" and broke the same rules specified in the SameSiteLax value”,
從Chrome 51開始,瀏覽器的Cookie新增加了一個SameSite屬性,用來防止CSRF攻擊和用戶追蹤,
該設定當前默認是關閉的,但在Chrome 80之后,該功能默認已開啟,
所以當你無法使用某些網站第三方登錄功能的時候,請查看一下是否受到了該設定的影響,
- 對于使用者,快速解決方案:
方案1. 打開
Chrome設定,將chrome://flags/#same-site-by-default-cookies禁用,然后重啟瀏覽器,
方案2. 使用低版本瀏覽器,可選擇70版, - 對于開發者,解決方案:
方案1. 將
SameSite屬性值改為None, 同時 將secure屬性設定為true,且需要將后端服務域名必須使用https協議訪問,
方案2. 由于設定SameSite = None,有SCRF風險,所以,最佳方案是用token代替Cookie方式作驗證,
一、CSRF 攻擊是什么?
Cookie 往往用來存盤用戶的身份資訊,惡意網站可以設法偽造帶有正確 Cookie 的 HTTP 請求,這就是 CSRF 攻擊,
舉例來說,用戶登陸了銀行網站your-bank.com,銀行服務器發來了一個 Cookie,
用戶后來又訪問了惡意網站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="https://www.cnblogs.com/gxp69/p/..."></a> |
發送 Cookie | 發送 Cookie |
| 預加載 | <link rel="prerender" href="https://www.cnblogs.com/gxp69/p/..."/> |
發送 Cookie | 發送 Cookie |
| GET 表單 | <form method="GET" action="..."> |
發送 Cookie | 發送 Cookie |
| POST 表單 | <form method="POST" action="..."> |
發送 Cookie | 不發送 |
| iframe | <iframe src="https://www.cnblogs.com/gxp69/p/..."></iframe> |
發送 Cookie | 不發送 |
| AJAX | $.get("...") |
發送 Cookie | 不發送 |
| Image | <img src="https://www.cnblogs.com/gxp69/p/..."> |
發送 Cookie | 不發送 |
2.3 None
Chrome 計劃將Lax變為默認設定,這時,網站可以選擇顯式關閉SameSite屬性,將其設為None,不過,前提是必須同時設定Secure屬性(Cookie 只能通過 HTTPS 協議發送),否則無效,
參考鏈接:http://www.ruanyifeng.com/blog/2019/09/cookie-samesite.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/38723.html
標籤:其他
上一篇:WZP網路結構模型,對OSI參考模型和TCP/IP模型的改進
下一篇:只用5分鐘帶你了解計算機網路概述
