csp 的条件下对于懒加载的影响

news/2025/1/20 20:58:01/文章来源:https://www.cnblogs.com/kongshu-612/p/18682512

csp 的条件下对于懒加载的影响

本文介绍在开启CSP的条件下,webpack 的懒加载会受到的影响。

Trusted Types

简单的说就是在使用Trusted Types的条件下,对于 DOM 的一些属性的赋值,必须要经过 policy,否则,浏览器会报错。这个安全机制是为了防止 XSS 攻击的注入攻击下沉(injection sink)。例如 html 中的innerhtml, script 的src属性等。得采用如下的方式来进行赋值

// 这些是定义对可能存在风险的代码进行消毒
cosnt mypolicy = trustedTypes.createPolicy('mypolicyName',{createHTML:(url)=>url,createScript:(script)=>script,createScriptURL:(url)=>url
});
const script = document.createElement('script');
script.src = mypolicy.createScriptURL(url);  // 相当于提供一个方式让你对于这些url 进行消毒。

webpack 中对于 dynamic import 会出现代码分割(code split), 当我们懒加载分割出来的 bundle 的时候,会遇到问题。如下是 webpack runtime 中进行动态加载的代码片段

script = document.createElement("script");
script.charset = "utf-8";
script.timeout = 120;
if (__webpack_require__.nc) {script.setAttribute("nonce", __webpack_require__.nc);
}
script.setAttribute("data-webpack", dataWebpackPrefix + key);
script.src = url;

也就是说 webpack 是通过在 dom 上创建script标签来加载懒加载的 bundle 的。那么script.src=url这段代码在开启 csp 的情况下是不允许的。所以会记载报错。那么所以的支持懒加载的框架都会遇到这个尴尬的问题

怎么解决这个问题呢?

方法一 hack, 既然script不能用,那加载 bundle,也可以采用 es6 的import()来实现。前提是你的运行环境是 es6.

  • 在你项目的入口文件中 import hack 的代码
// hack.js
/* eslint-disable no-undef */
(() => {var inProgress = {};if (__webpack_require__.l) {__webpack_require__.l = (url, done, key, chunkId) => {if (inProgress[url]) {inProgress[url].push(done);return;}inProgress[url] = [done];import(/*webpackIgnore: true*/ url).then((mod) => {var doneFns = inProgress[url];delete inProgress[url];doneFns &&doneFns.forEach((fn) => fn({ type: "timeout", target: null }));},(err) => {});};}
})();
- 然后将这个文件导入到你的`index.tsx|ts`的第一行,这里假设hack.js 与index.ts 在共同级目录,注意后缀名
import "./hack.js";
- 最后,修改webpack 中的module>rule, 对于`hack.js`不要进行babel 转码

这个方法本质上是替换掉 webpack runtime 中的懒加载的方式。

方法二, webpack 本身就对于 trustedTypes 进行支持

在 webpack.config.js 中的 output>trustedTypes 中放入你支持的 policy 的名字

output:{trustedTypes: {policyName: 'mypolicy',},
}

然后将这个 policy 加入到你的 html 的 meta 中

<metahttp-equiv="Content-Security-Policy"content="default-src 'self'; script-src 'self'; trusted-types myPolicy;"
/>

最终 webpack 的 runtime 会生成如下的代码


var policy;
__webpack_require__.tt = () => {// Create Trusted Type policy if Trusted Types are available and the policy doesn't exist yet.if (policy === undefined) {policy = {createScriptURL: (url) => (url)};if (typeof trustedTypes !== "undefined" && trustedTypes.createPolicy) {policy = trustedTypes.createPolicy("myPolicy", policy);}
return policy;
};script = document.createElement("script");
script.charset = "utf-8";
script.timeout = 120;
if (__webpack_require__.nc) {script.setAttribute("nonce", __webpack_require__.nc);
}
script.setAttribute("data-webpack", dataWebpackPrefix + key);
script.src = __webpack_require__.tt().createScriptURL(url);

总结

推荐方法二,一开始问了 chatgpt,被它给误导了,其实用 google 搜索,第二条就是答案。不能过度依赖 AI.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/872332.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【抓包工具】wireshark零基础使用教程

Wireshark是什么 Wireshark是使用最广泛的一款「开源抓包软件」,常用来检测网络问题、攻击溯源、或者分析底层通信机制。 它使用WinPCAP作为接口,直接与网卡进行数据报文交换。 Wireshark抓包原理 Wireshark使用的环境大致分为两种,一种是电脑直连互联网的单机环境,另外一种…

多端响应式

重要!响应式开发 目录重要!响应式开发是什么?怎么实现?媒体媒体查询断点是什么适配方案栅格布局响应式栅格系统实例 是什么? 多终端显示不同,更好看 PC,ipad,手机适配 怎么实现? 媒体查询,断点: 视口宽不同,布局不同 移动端??? 320-480端口 rem 不考虑大尺寸,更…

公共图床-OIER试炼场

公共图床-OIER试炼场 如何使用? 1. 使用浏览器直接访问 https://api-cdn.u1128333.nyat.app:35910/2. 通过插件访问 插件下载点我 MIT License, ©2025 Chan. 在浏览器扩展中添加即可使用。

32. 样式表

一、样式表为了美化窗口或控件的外观,可以通过窗口或控件的调色板给窗口或控件按照角色和分组设置颜色,还可以对窗口或控件的每个部分进行更细致的控制,这涉及窗口或控件的样式表(Qt style sheets, QSS),它是从 HTML 的层叠样式表(cascading style sheets, CSS)演化而来…

TIA SCL编程清除字符串中所有的空格

今天做一个小的练习,这是2025年第一个记录的学习笔记。 在IA新建一个FC,名字叫做TrimSpace,建立以下内部变量:写一段SCL代码: #len := LEN(#str_in);#str_trim_out := ;FOR #i := 1 TO #len DO   IF MID(IN := #str_in, L := 1, P := #i) <> THEN   …

计算几何相关

打算慢慢记一下扫描线,辛普森法和凸包。扫描线 扫描线直接照搬了...这篇主要是给之后的积分和凸包之类留的。 就是用线段树解决计算几何问题。 板梯 如何处理平面内一群矩形的面积交? 考虑用面积的朴素定义,\(S=ab\),相当于一堆面积合到一起就是 \(b\) 个可以不同的 \(a\) …

树状数组(学习笔记)

例题一:P3374 【模板】树状数组 1 例题二:P3368 【模板】树状数组 2 作用:特征: 一个多用于区间修改,和单点查询。或区间查询单点修改的数据结构,其代码量较少,比较好写。 区别: 它与线段树的功能差不多,但线段树的可拓展性更强。也就是说:树状数组能做的,线段树都能…

Centos根目录扩容

CentOS磁盘在根目录下扩容(无卷组情况下)查看磁盘分区情况,sda3挂载在根目录下,新扩容增加的sda4挂在在/data下现在想把sda4同样挂载在根目录下解决方法:删除sda3,再重建sda3(注意:删除后不要退出,紧接着重建,注意重建后的起始位置) 删除sda3然后重建输入下面那个命…

U455764 The Rotation Game

U455764 The Rotation Game 题目理解 本题要求移动\(A-H\)中的一列或一行,使其整个一行和一列的数字移动,使最后的中间8个的数字相同。求最少需要移动的步数和它的操纵顺序思路 1.本题可以很显然的想到用 \(BFS\) 来枚举执行不同字母操作后结果,但每 \(BFS\) 一次就会增加八…