1. 程式人生 > 實用技巧 >JavaScript 中的求值策略

JavaScript 中的求值策略

原文地址:https://www.cnblogs.com/jying/p/13555016.html

最近小夥伴說系統有一個跳轉第三方的功能有的人電腦端不好使了,我檢查了下自己的頁面,發現沒問題,於是一口答覆:不管!!!(其實是卑微的說:那先在手機端試試吧。結果手機端正常,於是就先忙別的事情了)

今天不經意間點了下自己手機端的功能,發現手機端也不顯示了!!!然後再看電腦端也不好使了!!!吃了一驚之後趕緊開始偷偷解決bug,可不能讓領導知道我寫了bug!!!

但是最近這個功能沒改過啊,之前一直好好的,怎麼突然就不行了呢?

這個功能是開啟第三方的頁面,利用約定好的金鑰token等載入登入者資訊,為了讓使用者感覺不到是外部連結,特地嵌入進iframe載入顯示,如果直接瀏覽器地址訪問連結是成功的,換firefox瀏覽器原頁面也是沒問題的,所以首當其衝想到的就是chrome不支援iframe了嗎???

網上查了下資料,果然有重大發現!!!

谷歌宣佈將從7月14日釋出的Chrome 84穩定版開始,重新恢復SameSite cookie策略,並且會逐步部署到Chrome 80以及以上的版本中。Chrome 80於今年2月份上線,谷歌就開始滾動推出SameSite更新,通過cookies的傳送機制進行了一系列新的調整更好的維護使用者隱私和安全。今年4月份鑑於全球疫情的爆發,谷歌宣佈暫時中止該更新,以便在疫情大流行期間保持重要網站的正常執行。

也就是說chrome從7月14號開始推行這個設定,但是因為所有使用者不是同時更新或安裝,所以先更新的人就先表現出問題來了。

從Chrome 51開始,瀏覽器的Cookie新增加了一個SameSite屬性,用來防止CSRF攻擊和使用者追蹤。該設定當前預設是關閉的,但在Chrome 80之後,該功能預設已開啟。

CSRF攻擊和使用者追蹤是怎麼回事?看看大神阮一峰的說明:http://www.ruanyifeng.com/blog/2019/09/cookie-samesite.html

解決方案總結:(開發者使用方案3)

方案1、手動修改瀏覽器的設定,這是對普通使用者而言的,對開發者來說肯定不合適。

方案2、重新安裝低版本瀏覽器,傻瓜方案。。。

方案3、開發後端設定 Set-Cookie 為SameSite=None; Secure(且可能要求必須為https方式)。

前面說了因為該系統是嵌入的第三方的內容,短時間內要求對方新增該cookie設定來不及,而且對方為了防止CSRF也不一定會同意,所以只能暫時去掉iframe直接暴露第三方站點了。。希望有好的解決方案的童鞋評論區留下解決方案~~


以下兩項為查詢資料過程中的相關知識,雖然使用場景不多,先記錄下來。

chrome 瀏覽器預設禁止iframe 巢狀頁面下載檔案:https://www.jianshu.com/p/789fd9fcd89d

出於沙盒安全性考慮,83版本的chrome瀏覽器預設禁止了iframe巢狀頁面通過a標籤的window.open,localtion.href點選下載,
為了解決這個問題,可以在父頁面的iframe中sandbox="allow-downloads"進行解決,請不要使用allow-downloads-without-user-activation ( 允許在沒有徵求使用者同意的情況下下載檔案)
<iframe sandbox="allow-downloads"></iframe>

chrome 現已支援延遲載入網頁中的 iframe:https://news.cnblogs.com/n/668031,通過新增 loading="lazy"屬性。

<iframe src="https://example.com" loading="lazy" width="600" height="400"></iframe>