HTML5 push/replaceState和<base>标记会导致安全性异常

JKS*_*JKS 8 html5 browser-history

我有一个站点的测试版本位于普通站点的子域,如:http: //test.x.com而不是http://x.com.

我使用<base>标记将所有资源请求转换回原始域:

<base href="http://x.com/" />
Run Code Online (Sandbox Code Playgroud)

在我实现HTML5 push/replaceState支持之前,这种策略很有效.

现在,如果我在控制台中执行此语句:

history.pushState({}, "", "");
Run Code Online (Sandbox Code Playgroud)

...然后我DOMException在基于WebKit的浏览器中获得一个对象:

code: 18
constructor: DOMExceptionConstructor
line: 2
message: "SECURITY_ERR: DOM Exception 18"
name: "SECURITY_ERR"
sourceId: 4839191928
__proto__: DOMExceptionPrototype
Run Code Online (Sandbox Code Playgroud)

...和FireFox 4中的此错误:

Security error" code: "1000
Run Code Online (Sandbox Code Playgroud)

如果我删除<base>标记并执行相同的语句,则会推送新状态,并且没有异常.

一些问题:1)这种行为是安全风险,还是一个bug?并且2)是否有一种解决方法来防止异常,或者除了使用<base>将完全回避问题的标签之外的策略?

谢谢你的考虑.

Use*_*ode 13

这不是一个错误,你违反了同源政策. ""是一个相对URL,'http://x.com/'由于您使用了<base>标记,因此将对其进行解析.http://x.com是一个与托管页面不同的域名,这就是为什么这样做会违反相同的原始政策.

在呼叫中使用指向http://test.x.com/上的资源的绝对URL history.pushState()应解决此问题:

history.pushState({}, "", "http://test.x.com/");
Run Code Online (Sandbox Code Playgroud)