2013-12-08 72 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

相关问题