使用Expo 45搭配React-Native 0.68.2时出现critical漏洞如何解决
Expo 45 项目shell-quote高危漏洞兼容修复方案
这个漏洞属于依赖链上的间接依赖问题,不需要按照audit提示强制升级不兼容的React Native 0.69.0版本,通过包管理器的依赖版本强制覆写能力,就能在保留Expo 45适配依赖的前提下修复漏洞。
方案1:npm项目修复(npm 8.3及以上版本支持)
- 打开项目根目录下的
package.json文件,新增顶层overrides字段,强制所有层级的依赖都使用修复了漏洞的shell-quote 1.7.3版本:
{ // 你项目里已有的name、version、dependencies等字段保留不动 "overrides": { "shell-quote": "1.7.3" } }
- 保存文件后,删除项目根目录下的
node_modules文件夹和package-lock.json文件,重新执行npm install完成依赖安装。 - 安装完成后执行
npm audit校验,critical级别的漏洞告警会直接消除,此时React Native版本仍然保持Expo 45要求的适配版本,不会出现兼容问题。
方案2:Yarn项目修复
- 如果项目使用Yarn作为包管理工具,打开根目录
package.json文件,新增顶层resolutions字段实现版本锁定:
{ // 保留所有已有配置字段 "resolutions": { "shell-quote": "1.7.3" } }
- 删除
node_modules文件夹和yarn.lock文件后,执行yarn install重装依赖,完成后校验漏洞状态和依赖版本即可。
关键注意事项
- 严禁直接执行
npm audit fix --force:该命令会无视项目的版本依赖约束,强制升级顶层依赖到最新版,直接将React Native升级到和Expo 45不兼容的0.69.0版本,会导致项目无法正常启动运行。 - shell-quote@1.7.3是纯安全补丁版本,没有任何破坏性API变更,完全向后兼容,Expo 45依赖链上所有引用该包的上层依赖都可以正常运行,不会出现功能异常。
- 如果本地npm版本低于8.3,先执行
npm install -g npm@8升级npm到支持overrides特性的版本,再执行上述修复操作。 - 后续如果升级到Expo 46及更高版本,官方已经在依赖链中默认锁定了安全版本的shell-quote,届时可以删除手动添加的overrides/resolutions配置。
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

