是否可以重写window.document.location.host?
用例:是否可以重写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 }
我的问题
安全吗?
是有可能重新定义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,任何远程域都无法读取内容包含用户名的回复。
您可以执行POST
或JQuery。
谢谢。覆盖在IE中工作,但不在FF和Chrome中。有没有解决方案来防止重写? – Dinh
我使用Chrome成功测试过。滚动自己的支票不是答案 - 这是SOP已经设计的目的。 – SilverlightFox
我没有告诉你的一件事是,我还想使用域www.mywebsite.com上设置的会话cookie在姊妹网站www.my-other-website.com上显示用户名。这就是为什么在我的情况下使用POST无用 – Dinh
你能详细说明一下你的代码或伪代码吗?我不确定我现在是否完全明白。 – janfoeh
我认为,不同方面可以阅读,修改和加载脚本。但你可以让它变得更难。除了对其进行硬编码以便仅在您的域中工作之外,我会缩小或打包它(或以其他方式混淆代码),并将服务器设置为仅在引用者是您的域时才提供脚本。 – towr