2013-12-08 113 views
0

用例是否可以重寫window.document.location.host?

  • 我的服務器是域www.mywebsite.com
  • 在網頁中,我有一個JavaScript代碼調用到WebService是在同一個酒莊
  • JavaScript調用簽名並只適用於在有限的時間
  • web服務使用一個會話cookie在同一個域中設置的用戶名 返回到瀏覽器
  • 這裏的風險是,一個惡意網站可以刮我的網頁,以獲得有效的Web服務調用,幷包括其頁面上的頁面上顯示的用戶名釣魚目的

我做什麼

讓說,我想阻止這個JavaScript的盜鏈: <script type="text/javascript" src="http://webservice.mywebsite.com/username.js?ID=SERVICE_ID;ts=1386607643;sig=52f72b1a0fe9158d87d9e4ba4e26a731"/>

在username.js,我做這個檢查:

if (document.location.host.match(/[.]mywebsite[.]com$/i) == null) { document.location.href="http://www.mywebsite.com/error.html"; } else { username = username_obtained_using_the_session_cookie }

我的問題
安全嗎?

+0

你能詳細說明一下你的代碼或僞代碼嗎?我不確定我現在是否完全明白。 – janfoeh

+0

我認爲,不同方面可以閱讀,修改和加載腳本。但你可以讓它變得更難。除了對其進行硬編碼以便僅在您的域中工作之外,我會縮小或打包它(或以其他方式混淆代碼),並將服務器設置爲僅在引用者是您的域時才提供腳本。 – towr

回答

1

是有可能重新定義window對象:

var window = '123'; 

alert(window.location); 

給出警報undefined

甚至覆蓋document對象(你的編輯你的問題):

var document = { "location" : { "host" : "www.mywebsite.com" } };

所以它現在通過測試:

if (document.location.host.match(/[.]mywebsite[.]com$/i) == null) { document.location.href="http://www.mywebsite.com/error.html"; } else { username = username_obtained_using_the_session_cookie } 

,如果你犯了一個更好的解決方案將是你的網絡服務對您的方法迴應POST而不是GET,然後由於Same Origin Policy,任何遠程域都無法讀取內容包含用戶名的回覆。

您可以執行POSTJQuery

+0

謝謝。覆蓋在IE中工作,但不在FF和Chrome中。有沒有解決方案來防止重寫? – Dinh

+0

我使用Chrome成功測試過。滾動自己的支票不是答案 - 這是SOP已經設計的目的。 – SilverlightFox

+0

我沒有告訴你的一件事是,我還想使用域www.mywebsite.com上設置的會話cookie在姊妹網站www.my-other-website.com上顯示用戶名。這就是爲什麼在我的情況下使用POST無用 – Dinh

相關問題