首页 > 其他分享 >csp 的条件下对于懒加载的影响

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

时间:2025-01-20 20:58:50浏览次数:1  
标签:__ script url webpack 条件 policy csp 加载

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 中

<meta
  http-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.

标签:__,script,url,webpack,条件,policy,csp,加载
From: https://www.cnblogs.com/kongshu-612/p/18682512

相关文章

  • 基于Simulink的匹配滤波器检测算法设计与低信噪比条件下的性能分析
    目录基于Simulink的匹配滤波器检测算法设计与低信噪比条件下的性能分析背景介绍系统架构仿真实现步骤1.创建新的Simulink模型2.添加信号生成模块生成已知信号在Simulink中实现信号生成模块3.添加噪声添加模块添加背景噪声在Simulink中实现噪声添加模块4.添加匹......
  • 请用css写一个扫码的加载动画图
    创建一个简单的扫码加载动画可以使用CSS的关键帧动画。以下是一个简单的例子,模拟了一个线条从左到右的扫描效果:HTML:<divclass="scanner"><divclass="scan-line"></div></div>CSS:.scanner{width:200px;height:100px;border:1pxsolid#000;......
  • wordpress安装完后台无格式解决方法(样式加载不出来)
     刚安装的wordpress,进入后台后,没有样式。1.如果ip进入,可能一切正常2.域名进入,遇到这种情况概率大(经过了nginx代理)正常访问文章的话是没问题的,只是管理后台存在这样的代码,样式没加载出来。美国随机地址生成器:美国随机地址生成器(随机地址生成器-生成全球真实地址),生成真实......
  • Java类加载机制与JVM运行时数据区各逻辑内存区域与JDK的版本相关差异浅谈
    Java类加载机制与JVM运行时数据区各逻辑内存区域与JDK的版本相关差异浅谈 【摘要】JVM(JavaVirtualMachine)作为Java研发人员工作的每天都会接触到的虚拟机,其运行机制与底层原理想必大家都略知一二,今天我将从初学者的角度出发,结合甲骨文官方的技术文档,对部分Java虚拟机的相关......
  • 网站页面加载速度慢,如何优化?
    可以从多个方面入手进行优化,以提升用户体验并提高网站的整体性能。以下是一些有效的优化策略:压缩图片资源:图片往往是影响网页加载速度的重要因素之一。建议使用图像编辑工具(如ImageOptim、TinyPNG等)对所有上传至网站的图片进行无损压缩。同时,尽量采用WebP格式代替传统的JPEG/PN......
  • PL/SQL 删除外键 ORA-02443: 无法删除约束条件-不存在的约束条件
    在PL/SQL中删除外键,无论是在【对象】窗口可视化操作删除还是用drop语句都会报错:ORA-02443:无法删除约束条件-不存在的约束条件看到有人有同样的问题。亲测之后:情况一:常规操作ALTERTABLEtable_nameDROPCONSTRAINTforeignkeyname;情况二:需要加引号(而且是双引号)ALTERTABL......
  • 最新版Edge浏览器加载ActiveX控件技术——alWebPlugin中间件V2.0.30_alpha-春节版发布
     allWebPlugin简介   allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品,致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX控件直接嵌入浏览器,实现插件加载、界面显示、接口调用、事件回调等。支持Chrome、Firefox、Edge、360......
  • 最新版Chrome浏览器加载ActiveX控件技术——allWebPlugin中间件之awp_CreateActiveXOb
     背景        ActiveXObject‌是JavaScript中的一个特殊对象,用于在InternetExplorer(IE)浏览器中创建和操作COM(ComponentObjectModel)对象。COM是一种面向对象的软件组件技术,允许不同应用程序之间的互操作性。通过ActiveXObject,JavaScript可以与Windows平台上的本地......
  • 性能优化-懒加载
    图片懒加载(插件)import{useIntersectionObserver}from"@vueuse/core";exportletimgLazyPlugin={install:(app:any)=>{//在这里编写插件代码app.directive("lazy-img",{mounted(el:any,binding:any){const{stop......
  • 应用"懒加载"模式,优化@Transactional事务性能
    背景在项目开发中,使用@Transactional注解来管理事务非常方便,且优雅。但是也存在一个问题:长事务问题很多被@Transactional标记的方法,实际上并不需要进行数据库操作,或者说,它们在执行的很长一段时间内都不会真正触发数据库访问。举个例子,我们的业务逻辑可能如下:@Servicepu......