如何不触发浏览器跳转仅修改地址栏URL中的hostname
问题结论
无法通过JS实现仅修改地址栏hostname、不触发页面跳转/加载的需求,这是浏览器的安全机制强制限制的,没有绕过空间。
限制原因
- 浏览器同源策略对
location对象的源属性有严格约束:hostname、protocol、port三个字段属于站点源标识的核心组成部分,只要修改任意一个,浏览器都会判定为要导航到新的跨域地址,立刻触发页面加载跳转,不可能仅修改地址栏显示内容不执行跳转。 - 可修改地址栏但不触发跳转的HTML5 History API(
history.pushState/history.replaceState),仅支持修改URL的路径、查询参数、哈希片段,完全不允许修改协议、域名、端口,尝试传入跨域域名时浏览器会直接抛出安全错误拒绝执行。
适配你测试场景的替代方案
你要测试点击劫持的场景完全可以通过其他合法方式实现,不需要修改地址栏hostname:
- 直接在和目标站点同域名的测试页面中嵌入目标iframe,此时
top.location.hostname与self.location.hostname天然一致,可直接测试点击劫持交互逻辑是否存在漏洞。 - 没有同域名测试环境的话,可以修改本地hosts文件,把目标域名指向127.0.0.1,在本地搭建同域名的测试服务即可满足校验条件。
- 也可以直接通过浏览器开发者工具篡改目标站点的校验逻辑:找到判断
top.location.hostname == self.location.hostname的代码段,打断点修改判断返回值,或者直接覆盖相关校验函数,让校验永久通过后即可测试点击劫持风险。
内容的提问来源于stack exchange,提问作者kalalua
相关产品推荐
相关产品推荐

