公司一年一度的代码安全审计如期而至,每次因为安全问题反反复复搞很久, 我们这边分为两种扫描,SAST(代码扫描)与SCA(依赖扫描),
SCA主要扫描的问题集中于:
- dependencies,devDependencies依赖包有安全问题
- 依赖包无最新版本,但依赖包的依赖有修复版本
- 依赖包有最新版本,但依赖包的依赖无修复版本
运行命令:
npm/yarn/pnpm audit // 检查依赖安全问题
npm/yarn/pnpm audit fix // 修复依赖
npm/yarn/pnpm audit fix --force // 强制修复依赖,破坏性修复,意味着代码可能跑不起来
这种方式一般是能修复第1种情况一小部分问题,如果是跨越大版本修复可能会有调整编码的工作量,自行评估。
对于第2种情况,一般做法是先强制指定版本,然后针对版本做代码调整打补丁,针对npm、yarn、pnpm
都有解决方案:
npm
强制指定版本,如果需要npm
支持,需要使用npm-force-resolutions
包,参考链接
打补丁方式使用 patch-package
参考链接,这个包的大概工作原理:
- 使用
npx patch-package {package-name
} 会生成一个git diff文件 - 每次使用
npm i
的时候会执行postinstall
脚本,有类似的preinstall
脚本,参考 npm生命周期 - 执行diff文件修改的代码覆盖至依赖中进行打补丁
使用步骤:
-
添加脚本
-
进入依赖包修改源码,例如我这里是
loader-utils
有安全问题,升级到最新版本1.4.2之后,nunjucks-html-loader1.1.0
引入loader-utils
会报错,找到源码路径修改 node_modules/nunjucks-html-loader/index.js -
运行命令
npx patch-package nunjucks-html-loader
自动生成patch文件如下:
此时如果删除依赖包重新安装,就会自动执行 postinstall
重新打补丁。
yarn
在package.json
使用resolutions
字段,可强行指定使用版本号,参考链接classic.yarnpkg.com/en/docs/sel…
打补丁方式也是使用patch-package
。
pnpm
如果使用的是pnpm
强制指定不版本有 pnpm.overrides
(版本5.10.0之后支持) 功能和 yarn
的resolutions
字段类似,在package.json
文件中添加
如果你的版本低于5.10.0,可使用pnpm hooks
,参考:
打补丁pnpm
有自带的pnpm patch
和patch-package
类似
//电脑复制地址访问文件夹
cd /private/var/folders/7m/9292jc5n6xq8h94zt9xy68r00000gn/T/8111c7e22dacf6fca8fccf11358caf50
//修改源码完成之后,按照提示执行
pnpm patch-commit /private/var/folders/7m/9292jc5n6xq8h94zt9xy68r00000gn/T/8111c7e22dacf6fca8fccf11358caf50
会在你的项目目录生成patch
文件夹,在package.json文件夹会多出pnpm.patchedDependencies
字段,在下次安装的时候,会自动打上补丁,可将patch文件夹提交到git方便团队其他同事安装。
对于第3种情况,如果依赖包有安全问题,且未更新,建议到git提交issue给作者,这个修复时间就未知了。
最后,建议在前期架构设计的时候,选择依赖库以社区活跃度高,更新迭代快的依赖包,方便升级更新。