最近在處理 iframe 跨域通訊(也就是postmessage的應用,有興趣可以看一下我的文章),發現了個比較頭疼的問題:在 iframe 環境中,無法跨域讀取內嵌網頁的 cookie ,得到的結果都是空值。
本來原計畫構思,iframe 通過 postmessage 實現跨域資料共享,但這個問題的出現讓我蛋碎不已…(´༎ຶд༎ຶ`)
如果不解決,前面的努力就等於全白搭了。
於是乎我便開始了各種查文件和解決方案。據文件說明:
chrome 51 開始,瀏覽器的 cookie 新增加了乙個samesite屬性,用來防止 csrf 攻擊和使用者追蹤。詳細可以檢視阮一峰的《cookie 的 samesite 屬性》,裡面有很明了的說明。cookie 的 samesite 屬性用來限制第三方 cookie,從而減少安全風險。
在 chrome 80 版本之後,samesite 將預設設定為 lax.
折騰良久後的結論:如果想用 iframe 無感知的實現 cookie 跨域共享,你是繞不開瀏覽器的限制的。除非瀏覽器是你做的,不然下面的方案是你唯一的出路… ╥﹏╥
想要讀取內嵌網頁網域名稱下的 cookie ,你得把 cookie 的 samesite 屬性設定為 none,也就是忽略同域限制;同時,設定 secure ,僅允許在https的環境中使用。
php:
header
('set-cookie: key=value; samesite=none; secure'
);
js:
document.cookie =
"key=value; samesite=none; secure"
注意,單一設定 samesite 為 none 是不生效的,必須同時設定 secure ;而開始 secure 之後,http 和 https協議的cookie是不互通的,小心別踩坑。
iframe跨域通訊
簡述 window.postmessage方法,允許跨視窗通訊,不論這兩個視窗是否同源。視窗都可以通過message事件,監聽對方的訊息。語法 otherwindow.postmessage message,targetorigin,transfer message 傳送的內容。targetorgi...
iframe解決跨域
iframe的使用a域中有parent.html,b域中有child.html.b域中的伺服器要監聽所有b域下所有child.html,並且兩個域之間要交換資料.那麼在a域中嵌入iframe 如 parent.html document.domain ip a域的ip或網域名稱 去掉www 函式fu...
iframe跨域訪問
子iframe使用jquery訪問父頁面時,報錯uncaught domexception blocked a frame with origin url from accessing a cross origin frame.這是跨域導致的 設host 進行網域名稱重定向,開啟c windows ...