为了安全给第三方嵌入块加了 sandbox 页面能显示 里面提交按钮点了没反应 同源的旧嵌入块却正常 控制台报 Blocked form submission because the frame is sandboxed and allow-forms is not set。乍看像缓存或者权限的锅,追下去往往不是。

<iframe src='https://f.b.com' height='520'
        sandbox='allow-scripts allow-forms' width='100%'>

追下去是这么回事:sandbox 默认把能力全关掉 只写一个 sandbox 等于全部禁用 表单提交 脚本 弹窗 顶层跳转 都要单独列出来允许 能显示不代表能操作 跨域嵌入时更明显。

「iframe sandbox 限制」这类改动最怕改一半,回滚脚本先准备好,再动生产。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。别只看报错的最后一行,往上看几行,真正的起因通常在上面。

具体做法是,按实际需要逐项放行 先加 allow-scripts 和 allow-forms 这两个 别一次全开;allow-scripts 和 allow-same-origin 同时给等于没有沙箱 同源内容要格外谨慎对待;加完逐项测提交 弹窗 下载 确认没有漏掉必要权限。

验收就看一点,iframe 内表单能提交 弹窗和脚本按预期工作 不需要的权限仍然是关闭的。

作者 9823189