我是如何在 React项目用 babel插件做的Xss防护

背景:公司的项目统一需要做Xss防护,Vue3、Vue2、React 的项目都需要做,这篇文章先写如何在 React里面做的,Vue 系列的后续补充到掘金

结论 :我们知道 React 的 dangerouslySetInnerHTML 是 React 为浏览器 DOM 提供 innerHTML 的替换方案。 如果项目里面 dangerouslySetInnerHTML 比较多的话,又懒得一个一个改,可以使用 babel-plugin-react-injectxsscode 插件,在编译阶段可以自动注入 dangerouslySetInnerHTML.__html 所需要的 XSS 过滤方法。(实际的 Xss 函数还是需要自定义的, 只是babel-plugin-react-injectxsscode 帮你找到需要注入的地方,并且完成注入)

介绍:babel-plugin-react-injectxsscode 是一个 babel 插件,接入该插件对原先的业务没有侵入,当识别到 jsx 文件里面的 dangerouslySetInnerHTML 属性之后,自动注入 在 babel.config.js 配置的 packageName 的 injectFnName函数包装 dangerouslySetInnerHTML属性值(其实是一个高阶函数,类似 AOP 的概念,对dangerouslySetInnerHTML属性值 进行增强,只不过这里的增强是 XSS 增强)

github 源码插件链接

如何使用:

json 复制代码
// 使用 npm 安装 babel-plugin-react-injectxsscode 插件
npm i babel-plugin-react-injectxsscode`
js 复制代码
//babel.config.js 或者 .babelrc
const babelPluginReactInjectXssCode = require('babel-plugin-react-injectxsscode')
module.exports = {
    ...
    plugins: [
        ...
        // [packageName] 是 编译之后 导入的 npm 包的名字
        // [composeXssFn] 是 packageName这个 npm包导出的函数
        
        // 从 [packageName] 导出 [composeXssFn] 函数给 dangerouslySetInnerHTML 使用
        
        [babelPluginReactInjectXssCode, { packageName: 'utils', injectFnName: 'composeXssFn' }]
    ]
}

效果如下所示

对业务代码没有任何入侵

使用插件效果(webpack 编译 jsx 的效果图)

使用插件效果(单个 jsx 文件编译之后的效果图)

原理分析:

  • 识别到jsx文件
  • 找到jsx文件到 dangerouslySetInnerHTML对应的__html属性对应的 value
  • 查看改jsx文件有没有 导入过 [packageName] 这个包,没有倒入过的话直接倒入(新增一个 import 节点)。如果导入过的话,需要查看 [injectFnName] 函数有没有倒入过,如果[injectFnName] 函数导入过的话,无需任何处理。没有没有倒入,在AST里面导入该函数。
  • 详细看源码注释 (github 源码插件链接)
相关推荐
空&白3 分钟前
css元素的after制作斜向的删除线
前端·css
海盐泡泡龟4 分钟前
“组件、路由懒加载”,在 Vue3 和 React 中分别如何实现? (copy)
前端·javascript·react.js
_揽36 分钟前
html如何在一张图片上的某一个区域做到点击事件
前端·html
踢足球的,程序猿39 分钟前
从 Vue 2.0 进阶到 Vue 3.0 的核心技术解析指南
前端·javascript·vue.js·前端框架·html
冷凌爱40 分钟前
Fetch与Axios:区别、联系、优缺点及使用差异
前端·node.js·js
袁煦丞1 小时前
跨平台终端王者Tabby:cpolar内网穿透实验室第632个成功挑战
前端·程序员·远程工作
Sailing1 小时前
Grafana-mcp-analyzer:基于 MCP 的轻量 AI 分析监控图表的运维神器!
前端·node.js·mcp
阿山同学.1 小时前
AWS 亚马逊 S3存储桶直传 前端demo 复制即可使用
前端·javascript·aws
Jolyne_2 小时前
grid 实现完美的水平铺满、间隔一致的自适应布局
前端·css
西洼工作室2 小时前
【解决导航栏字体图标渲染导致文本闪烁问题】采用腾讯视频的解决方案
前端·css·css3