pushState如何防范潜在的内容伪造?

时间:2011-05-31 21:50:42

标签: javascript security html5 phishing pushstate

GitHub's blog所示,他们为树木浏览(针对现代浏览器)实施了HTML5's JavaScript pushState功能,带来了AJAX导航without Hash Bangs

代码很简单:

$('#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. 更改浏览器网址(不仅仅是#,正如Twitter所做的那样 - twitter.com/stackexchangetwitter.com/#!/stackexchange
  4. 我的问题是,JavaScript如何防止一个网站使用pushState来模仿另一个网站,从而产生令人信服的phishing attack

    至少看起来域名无法更改,但网站内的多条路径又可能由多个不相关且不可信的内容提供商进行更改?一条路径(I.E. / joe )是否可以模仿另一条路径(pushState / jane )并提供模仿内容,可能是恶意目的?

2 个答案:

答案 0 :(得分:9)

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

这里还有一些Same Origin Policy - 这对他们来说似乎不是问题。还有一个关于detail on what the FireFox folks are thinking about pushState的讨论,但它是一个不同的问题,关于能够在别人的URL的末尾隐藏恶意查询字符串。

答案 1 :(得分:2)

正如nrabinowitz所言,并且用更多门外汉的术语来说:它仅限于同一个域,就像ajax调用和cookie一样。所以这是完全安全的 - 虽然对最终用户来说有点偷偷摸摸。

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

  1. 看起来更干净。
  2. 重新访问深层链接,您实际上可以显示真实的HTML数据,以支持搜索引擎优化和Facebook Open Graph等内容(两者都会发送蜘蛛来浏览页面的HTML)。
  3. 服务器无权访问哈希标记数据,因此您不会在服务器日志中看到它,因此它可以帮助某些人进行分析。
  4. 它有助于修复哈希标记问题。例如,我进行了Nginx重写,将访问我的应用的用户重定向到相同的https网址。它适用于所有浏览器,但Safari会将您重定向到没有哈希的域(非常烦人!)