是否可以覆盖window.document.location.host?

时间:2013-12-08 14:44:49

标签: javascript security browser client-side

用例

  • 我的服务器位于 www.mywebsite.com
  • 域中
  • 在网页中,我有一个JavaScript标签调用WebService,它位于同一个域中
  • JavaScript调用已签名且仅在有限时间内有效
  • WebService使用在同一域中设置的会话cookie来返回用户名 到浏览器
  • 此处存在的风险是,恶意网站可能会抓取我的网页以获取有效的WebService调用并将其包含在其页面中以在其网页上显示用户名以进行网络钓鱼目的

我做什么

假设我想阻止此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 }

我的问题
这样安全吗?

1 个答案:

答案 0 :(得分: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将无法回复任何远程域都可以读取包含用户名的响应内容。

您可以在plain JavaScript中执行POST,也可以使用JQuery