跳到主要内容

网页视图为什么要内容安全策略、消息传递和资源地址转换?

结论​

网页视图是隔离来源里的 iframe。它不能读扩展宿主的变量,也不能随意加载磁盘文件。所以脚本和样式要靠内容安全策略收紧,数据靠 postMessage,本地资源要转成这个网页被允许访问的地址。

展开​

从安全模型看,Webview 和普通插件代码不是一家人。如果允许页面直接碰 Node 或任意 file://,那么只要预览内容里混进一段脚本,就能读工作区和密钥。隔离来源加上内容安全策略,是把损坏限制在页面里。

三件事对应三种跨边界:

  • 内容安全策略:这个页面能不能执行内联脚本、能不能连某个域名
  • postMessage:页面和扩展交换数据,替代共享内存
  • asWebviewUri 加 localResourceRoots:把插件目录里的脚本、图片映射成可加载地址,并限制目录

前端同学容易用「父页面直接拿 iframe.contentWindow 调方法」来类比。这里父页面不是你的插件,你写不出那层直接调用,只能用编辑器注入的 acquireVsCodeApi()。

主题也是跨边界的一种:编辑器通过 CSS 变量把颜色送进 iframe。不要假设父页面的 class 你能选到。

更新界面时重新设置整个 html 会毁掉页面状态。初始化之后的数据变化都应走消息。

容易讲错的点​

  • 开了 enableScripts 只是允许脚本,不等于放开策略。
  • 消息可被页面里的任意脚本发送。扩展侧要校验 type,不要执行页面传来的任意命令。
  • 资源地址转换解决的是加载,不是鉴权用户。工作区文件仍可能含有恶意内容。