iframe沙箱环境下href的javascript伪协议点击不生效问题
问题根因
- 首先iframe的
sandbox属性写法不符合规范:该属性的多个权限令牌必须使用半角空格分隔,使用||作为分隔符属于非法写法,会导致浏览器权限解析异常,部分配置的权限实际未生效。 - 两类JS代码的执行逻辑被浏览器沙箱做了明确区分:
- 测试用的
<script>标签内代码属于iframe文档自身的内嵌脚本,只要allow-scripts权限被正确识别,就会在文档解析阶段正常执行,这也是第二个测试用例能正常输出1的原因。 <a>标签href属性中javascript:伪协议触发的代码,本质是用户点击触发的导航类脚本执行,不属于文档内嵌脚本范畴。最新版Firefox的沙箱安全策略对这类场景有额外校验:除基础的allow-scripts权限外,还要求沙箱必须配置allow-top-navigation-by-user-activation权限,且所有权限令牌必须用合法的空格分隔,否则会直接拦截该类脚本执行,控制台不会抛出任何报错。
- 测试用的
- 修正权限后仍看不到输出,可检查F12控制台的上下文选择器,确认当前选中对应iframe的执行上下文而非顶层页面,iframe内的console输出会被顶层上下文默认过滤。
修复方案
将sandbox属性的非法分隔符替换为半角空格,补充缺失的allow-top-navigation-by-user-activation权限即可,修正后代码如下:
<iframe srcdoc="<a href="javascript:console.log(1)">test</a>" sandbox="allow-same-origin allow-scripts allow-top-navigation allow-popups allow-top-navigation-by-user-activation"></iframe>
内容的提问来源于stack exchange,提问作者Revoltage The Lord
相关产品推荐
相关产品推荐

