簡體   English   中英

保護 postMessage 跨域

[英]Securing postMessage cross-origin

我在不同的域上有兩個 web 頁面,我控制兩個頁面的代碼。

Domain-A 使用window.open打開 Domain-B,然后 Domain-B 進行一些客戶端處理(不能移動到服務器端),然后使用postMessage將結果發布回來。

但在發布這些結果之前,我想確保window.opener實際上是我。

問題是: Domain-A 各不相同,可以是任何東西(客戶在他們自己的域上托管我的應用程序),而 Domain-B 是固定的。 所以我不能只在我的postMessage中設置targetOrigin ,因為來源一直都是不同的。 我知道我可以簡單地使用'*'並且它會正常工作,但這還不夠安全。

因此,在發送postMessage之前,我想驗證我的頁面是否真的是window.opened由我的代碼打開,而托管代碼的域會有所不同。

我想出的唯一解決方案是異步加密。 將公鑰加密的簽名查詢字符串添加到window.open ,然后使用配對密鑰在域 B 上使用crypto.subtle.verify驗證該簽名。

我在正確的軌道上嗎? 有沒有更簡單的選擇,甚至可能是最佳實踐? 好像我在這里重新發明輪子......

使用跨域資源共享 (CORS) 是一種選擇。 有一個選項可以使經過認證的請求傳遞身份驗證信息。 作為兩個域的管理員,這更容易。 您可以在您的域中使用 Access-Control-Allow-Origin 設置來允許他們發出憑據請求。

有一篇寫得很好的文章 MDN 比我解釋得更好: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS

您可以在請求中包含的標頭: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#The_HTTP_response_headers

這部分會很有趣,因為您想確保帖子是您的代碼: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Requests_with_credentials

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM