12

GitHub 的博客中可以看出,他们已经实现了HTML5 的 JavaScriptpushState功能用于树浏览(适用于现代浏览器),带来了没有 Hash Bangs的 AJAX 导航。

代码很简单:

$('#slider a').click(function() {
  history.pushState({ path: this.path }, '', this.href)
  $.get(this.href, function(data) {
    $('#slider').slideTo(data)
  })
  return false
})

这非常优雅地允许他们:

  1. 通过 AJAX 请求新内容而不是整页
  2. 动画过渡
  3. 更改浏览器 URL (不仅仅是#,就像 Twitter 所做的那样 — twitter.com/stackexchangetwitter.com/#!/stackexchange

我的问题是,JavaScript 如何防止pushState一个网站使用模仿另一个网站,从而导致令人信服的网络钓鱼攻击

至少域似乎无法更改,但是站点内的多个路径可能由多个不相关且不信任的内容提供者提供呢?一条路径 (IE /joe ) 是否可以本质上模仿另一条路径 (pushState /jane ) 并提供具有可能恶意目的的模仿内容?

4

2 回答 2

9

我的理解是,这与管理、设置 cookie 和各种其他浏览器功能的同源策略完全一致。XMLHttpRequest假设是,如果它在同一个域 + 协议 + 端口上,它是一个受信任的资源。通常,作为 Web 开发人员,这就是您想要(和需要)的,以使您的 AJAX 脚本能够工作并且您的 cookie 在整个站点中都可以读取。如果您正在运行一个用户可以发布内容的网站,那么确保他们不会对彼此的访问者进行网络钓鱼或键盘记录是您的工作,而不是浏览器的工作。

这里有一些关于 FireFox 人员正在考虑的更多细节pushState——这对他们来说似乎不是问题。这里有另一个关于可能存在的pushState安全漏洞的讨论,但这是一个不同的问题,即能够在其他人的 URL 末尾隐藏恶意查询字符串。

于 2011-06-01T21:18:56.823 回答
2

正如 nrabinowitz 所说,用更通俗的话来说:它仅限于同一个域,就像 ajax 调用和 cookie 一样。所以它是完全安全的——尽管对最终用户来说有点偷偷摸摸。

我们(开发人员)一直在用哈希标签做这件事,但这样做更好,因为:

  1. 它看起来更干净。
  2. 在重新访问深层链接时,您实际上可以显示真实的 html 数据以支持诸如 SEO 和 Facebook Open Graph 之类的东西(两者都发送蜘蛛来修饰页面的 html)。
  3. 服务器无权访问哈希标签数据,因此您不会在服务器日志中看到它,因此它可以帮助某些人进行分析。
  4. 它有助于解决哈希标签问题。例如,我进行了 Nginx 重写,以将访问我的应用程序的用户重定向到相同的 https url。它适用于所有浏览器,但 Safari 会将您重定向到没有哈希的域(太烦人了!)
于 2012-05-18T06:22:59.483 回答