技术文档丨 OpenSCA技术原理之npm依赖解析

AI安全悬镜,开源软件成分检测工具丨OpenSCA使用攻略 与传统的企业版SCA工具相比,OpenSCA展现了独特的优势。轻量级、易于使用,同时具备完整的功能,支持漏洞库、私服库的自主配置,能够适应IDE、命令行、云平台等多种使用场景。 阅读详情

本文主要介绍基于npm包管理器的组件成分解析原理。

npm介绍

npm(全称Node Package Manager)是Node.js标准的软件包管理器。

npm的依赖管理文件是package.json,开发者可以在package.json中指定每个依赖项的版本范围。

如果一个项目中存在package.json文件,便可以执行npm install命令自动安装和维护当前项目所需的所有模块并生成package-lock.json文件。

package.json完整文件结构如下:

{
  "name": "screeps",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "push": "rollup -cw --environment DEST:main",
    "build": "rollup -cw --environment DEST:local",
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@rollup/plugin-commonjs": "^21.0.1",
    "@rollup/plugin-node-resolve": "^13.1.1",
    "@types/lodash": "^3.10.1",
    "@types/screeps": "^3.2.4",
    "rollup": "^2.61.1",
    "rollup-plugin-clear": "^2.0.7",
    "rollup-plugin-copy": "^3.4.0",
    "rollup-plugin-screeps": "^1.0.1",
    "rollup-plugin-typescript2": "^0.31.1",
    "typescript": "^4.5.4"
  },
  "dependencies": {
    "source-map": "^0.6.1"
  }
}

其中name为项目名,version为项目版本,license为项目声明的许可证,devDependencies为开发环境使用的依赖,dependencies为生产环境使用的依赖。

依赖写法为"name":"version",版本可以指定准确版本或一个范围,范围需遵循semver语义化版本规范(详见:https://semver.org/)。

解析算法

package-lock.json

package-lock.json是在npm install时自动生成的文件,用以记录当前状态下实际安装的各个npm package的具体来源和版本号,通过该文件可以准确定位到npm项目的依赖及版本。所以优先解析package-lock.json文件。

package-lock.json文件结构如下:

{
  "name": "foo",
  "version": "1.0.0",
  "dependencies": {
    "b": {
      "version": "1.2.1"
    },
    "a": {
      "version": "2.1.5",
      "requires": {
        "b": "^1.1.9"
      }
    },
    "c": {
      "version": "1.3.1",
      "requires": {
        "b": "^1.2.0"
      }
    }
  }
}

其中name字段为项目名称,version字段为项目版本。dependencies字段中包含项目使用的所有直接和间接依赖,而且记录了组件间的依赖关系。

例如:

"b": {
  "version": "1.2.1"
},

代表组件b的版本号为1.2.1。

"a": {
  "version": "2.1.5",
  "requires": {
    "b": "^1.1.9"
  }
},

代表项目依赖2.1.5版本的组件a,该组件依赖版本约束为^1.1.9的组件b。 

同理可知项目依赖1.3.1版本的组件c,该组件依赖版本约束为^1.2.0的组件b。 

从<package-lock.json文件结构>可看出组件a和组件c都没有被其他组件所依赖,所以可知这两个组件是项目的直接依赖。 

仅通过package-lock.json无法确定组件b是否是直接依赖,可以结合package.json文件进一步确定,没有package.json时,将b当作间接依赖处理。若一个组件同时为直接和间接依赖,按直接依赖处理。

注:

  • ^1.1.9代表版本号需要>=1.1.9且<2.0.0;

  • ^1.2.0代表版本号需要>=1.2.0且<2.0.0;

  • 更多约束格式请参阅semver官网

由此可以构建出当前项目的依赖结构:

实线代表直接依赖,虚线代表间接依赖。

package.json

package.json为开发者编写管理的依赖管理文件,在未找到package-lock.json文件时将解析该文件。 

package.json仅包含直接依赖,在项目构建时会从npm仓库下载需要的间接依赖并构建为package-lock.json文件,因此可以模拟npm构建流程来获取项目引用的组件依赖。

package.json文件结构如下:

{
  "name": "foo",
  "version": "1.0.0",
  "devDependencies": {
    "a": "^2.0.0"
  },
  "dependencies": {
    "c": "^1.1.0"
  }
}

dependencies为项目实际使用的直接依赖,devDependencies为项目开发时使用的直接依赖。

例如:​​​​​​​

"devDependencies": {
  "a": "^2.0.0"
}

代表项目开发过程中依赖版本约束为^2.0.0的组件a。

"dependencies": {
  "c": "^1.1.0"
}

代表项目直接依赖版本约束为^1.1.0组件c。

分析到这里我们可以总结出如下图依赖关系:

通过该依赖关系可以看出项目组件的直接依赖及组件的版本范围,但无法得知组件依赖的具体版本。

在没有package-lock.json文件的情况下,为了进一步获取依赖的准确版本及间接依赖,需要从npm仓库下载对应组件的详细信息。

例如组件a的详细信息结构为:

{
  "time": {
    "2.1.5": "2011-02-16T22:31:02.088Z",
    "3.1.1": "2011-04-10T12:23:22.088Z"
  },
  "versions": {
    "2.1.5": {
      "dependencies": {
        "b": "^1.1.9"
      }
    },
    "3.1.1": {
      "dependencies": {
        "b": "^2.2.0"
      }
    }
  }
}

其中time字段为组件所有版本及发布日期,根据约束从这里获取约束范围内的最大版本。 

versions字段为组件各个版本对应的详细信息,其中dependencies字段为组件的依赖信息。

对于本例来说,组件a的约束为^2.0.0,要求版本号>=2.0.0且<3.0.0,所以选择2.1.5版本。因此组件依赖结构就变成了:

按照这种方式层级解析便可获取整个项目的依赖信息。


OpenSCA是悬镜安全旗下源鉴OSS开源威胁管控产品的开源版本,继承了源鉴OSS的多源SCA开源应用安全缺陷检测等核心能力。OpenSCA用开源的方式做开源风险治理,致力于做软件供应链安全的护航者,守护中国软件供应链安全。

OpenSCA的代码会在GitHub和Gitee持续迭代,欢迎Star和PR,成为我们的开源贡献者,也可提交问题或建议至Issues,我们会参考大家的建议不断完善OpenSCA开源项目,敬请期待更多功能的支持。

GitHub:

https://github.com/XmirrorSecurity/OpenSCA-cli/

Gitee:

https://gitee.com/XmirrorSecurity/OpenSCA-cli/

OpenSCA官网:

https://opensca.xmirror.cn/

第三方依赖扫描工具(OpenSCA) OpenSCA用来扫描项目的第三方组件依赖及漏洞信息。 阅读详情

相关推荐

np2km:分析NPM依赖,并生成文件kityminder文件

np2km 脑图效果: 概要 NPM 依赖生成为脑图的工具 安装 $ npm install np2km -g 使用 使用前先确认已经调用 npm install $ cd <dir> $ np2km 生成的文件拖拽到 使用 后续 在线模块 $ np2km -n grunt $ np2km -n grunt@0.1.1

npm安装包依赖管理

前言 提起 npm,大家第一个想到的应该就是 npm install 了,但是 npm install 之后生成的 node_modules 大家有观察过吗?package-lock.json 文件的作用大家知道吗?除了 dependencies 和 devDependencies,其他的依赖有什么作用呢?接下来,本文将针对 npm 中的你可能忽略的细节和大家分享一些经验。 npm 安装机制 A 和 B 同时依赖 C,C 这个包会被安装在哪里呢?C 的版本相同和版本不同时安装会有什么差异呢?packa

asxw00的博客 5452

npm-dependency-analyzer:插件来分析npm项目中的依赖关系

npm-dependency-analyzer 在Node.js环境下开发的项目中分析开源依赖项。 该插件分析项目的所有依赖关系,以检查漏洞和许可证。 要求 8.0.0或更高版本的Node.js。 项目必须有一个名为.osda的策略文件 策略文件结构 { " $schema " : " http://json-schema.org/draft-04/schema# " , " title " : " Project Policy " , " description " : " A policy with a project related configurations and \t information " , " type " : " object " , " properties " : { " project_id " : { " des

深入探索npm依赖:掌握查看与管理包依赖的艺术

npm是Node.js的默认包管理器,它拥有一个庞大的包注册表,包含成千上万的可重用代码包。npm帮助开发者安装、共享和管理有依赖关系的包。

2401_85760095的博客 3607

npm-dep-graph:分析npm依赖性

原料药 目录

Alphafold2/multimer本地安装避坑指南:从Conda环境配置到GPU加速实战

本文详细介绍了Alphafold2/multimer本地安装的全流程,从Conda环境配置到GPU加速实战,特别针对常见的报错处理提供了解决方案。通过硬件环境检查、依赖安装技巧、OpenMM补丁应用等步骤,帮助研究人员高效部署蛋白质结构预测工具,提升计算效率。

weixin_29309213的博客 119

依赖检查工具depcheck

当项目中正常 npm i 安装依赖且没有报错的情况下,项目依然运行不起来。安装完成后,可以通过 depcheck 检查项目缺失的依赖。

hs1219462412的博客 535

从原理到实现:在《图灵完备》中构建一个144*256像素、1536时钟刻/帧的视频播放器

本文详细解析了在《图灵完备》游戏中构建144*256像素、1536时钟刻/帧视频播放器的全过程。从图灵完备原理出发,通过分层架构设计、视频数据预处理和关键电路实现,展示了如何用基础电子元件模拟现代显卡功能。重点介绍了像素坐标定位系统和颜色数据处理流水线的优化方案,为游戏内复杂电子系统设计提供实践指导。

weixin_42520025的博客 445

一文读懂,五大SCA关键技术

SCA逐渐成为企业软件治理的“必备神器”,强大能力的背后离不开关键技术的支撑,开源网安在为上百家客户服务的实践中认为,软件成分分析技术、组件多链路依赖分析技术、二进制分析、漏洞级代码溯源分析、函数级漏洞可达性定位检测等几大技术是决定SCA检测能力的关键。

weixin_55163056的博客 1432

华为昇腾NPU环境搭建:torch-npu安装避坑指南(附常见错误解决方案)

本文详细解析了在华为昇腾NPU环境中安装torch-npu适配包的全流程与核心要点。从基础环境准备、严格的版本匹配策略,到针对‘RuntimeError: NPU error’、‘ImportError: libxxx.so’等高频错误的深度解析与解决方案,提供了一份实用的避坑指南,旨在帮助开发者高效搭建稳定的PyTorch开发环境。

weixin_29094979的博客 412

ArcMap 10.7/10.8启动加载界面后闪退?可能是这个隐藏的Normal.mxt模板文件在搞鬼

本文深入分析了ArcMap 10.7/10.8启动加载界面后闪退的问题,指出Normal.mxt模板文件损坏是常见原因。提供了从定位、删除模板文件到系统级修复的完整解决方案,帮助GIS工程师快速恢复工作流程。

weixin_28523493的博客 332

OpenSCA-cli终极指南:10分钟掌握第三方依赖安全扫描

OpenSCA-cli是一款免费开源的软件成分分析工具,专门用于快速检测项目中的第三方组件依赖、漏洞风险及许可证信息。作为企业及个人用户的首选安全解决方案,它提供高精度、稳定易用的开源软件供应链安全保障。本文将通过简单实用的方法,帮助您从零开始掌握这款强大的安全扫描工具。 ## 🚀 快速上手:最简单的扫描方法 想要立即体验OpenSCA-cli的强大功能?只需一条命令就能开始扫描: ```

gitblog_01009的博客 678

封装CTP API为Java SDK

本文介绍了在Windows环境下使用Java调用CTP API的编译实现过程。首先需要准备CTP API SDK、JDK、SWIG和Visual Studio等工具,配置好开发环境。然后通过搭建目录结构、编写SWIG接口文件ctp.i,实现C++到Java的代码转换。文中详细说明了文件目录组织方式,并提供了处理中文乱码的代码示例。通过这一系列步骤,最终将CTP的C++接口转换为Java可调用的形式,为Java项目获取期货实时报价数据提供支持。

weixin_43952815的博客 1223

如何快速上手OpenSCA:开源软件安全检测工具完整实战指南

你是否曾担心项目中的第三方依赖存在安全隐患?面对日益复杂的软件供应链,如何快速识别潜在的安全漏洞?今天我要分享的OpenSCA开源软件成分分析工具,正是解决这一痛点的利器。作为一款强大的开源安全检测工具,OpenSCA能够帮助开发者高效扫描项目依赖、识别安全漏洞并管理许可证风险,让软件供应链安全变得简单可靠。 ## 为什么选择OpenSCA进行软件安全检测? 在当今快速迭代的开发环境中,项目依

gitblog_01098的博客 412

MFC C++ 中开发 PLC 通信客户端

OPC UA | 工业标准化通信 | `open62541`(开源OPC UA库)或 `UA-.NET` 封装 | 跨平台、安全可靠,支持复杂数据类型 |- 连接句柄(`modbus_t*`/`UA_Client*`/`TS7Client*`)不可跨线程共享,需为每个线程创建独立连接。Modbus 是工业常用协议,分 **RTU**(串口)和 **TCP**(以太网)两种模式,以下以 Modbus TCP 为例。s=Tag`),复杂类型需解析扩展对象。

寒寒豆豆软件公司的博客 139

FFTW3库在Windows中的安装和使用

Windows 32位平台下载:FFTW Installation on Windows。

weixin_45397344的博客 951

【热门开源项目下载】OpenSCA-cli

【热门开源项目下载】OpenSCA-cli 【免费下载链接】OpenSCA-cli OpenSCA 是一款开源的软件成分分析工具,用于扫描项目的开源组件依赖、漏洞及许可证信息,为企业及个人用户提供低成本、高精度、稳定易用的开源软件供应链安全解决方案。 ...

gitblog_01426的博客 947

Slow waitForAckedSeqno took 64873ms (threshold=30000ms). File being written

Slow waitForAckedSeqno took 64873ms (threshold=30000ms). File being written

zhengzaifeidelushang的博客 2011

【亲测免费】 OpenSCA-cli 常见问题解决方案

OpenSCA-cli 常见问题解决方案 项目基础介绍 OpenSCA-cli 是一个开源的软件供应链安全解决方案,旨在帮助开发者检测开源依赖中的漏洞和许可证合规性问题。该项目支持多种编程语言和对应的包管理器,能够解析配置文件并生成详细的报告。 主要编程语言 OpenSCA-cli 支持以下编程语言及其对应的包管理器: Java: Maven, Gradle JavaScript: Npm, Y...

gitblog_00919的博客 1319

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

开源软件供应链安全治理:OpenSCA如何解决多语言依赖风险检测难题

在当今快速迭代的软件开发环境中,开源组件已成为项目构建的基石,但随之而来的供应链安全风险也日益严峻。OpenSCA作为一款开源的软件成分分析工具,通过精准的多语言依赖识别、双模式漏洞检测和灵活的集成方案,为企业和开发者提供了一套高效、低成本的供应链安全治理解决方案,帮助企业快速识别第三方组件中的安全漏洞和许可证风险,实现从开发到部署的全流程安全管控。 ## 🎯 核心理念:构建主动防御的供应链安

gitblog_00470的博客 335

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

OpenSCA-cli:企业级开源软件供应链安全治理解决方案

在数字化转型加速的今天,软件供应链安全已成为企业面临的核心挑战。开源组件作为现代软件开发的基石,其安全风险直接影响业务连续性和数据安全。OpenSCA-cli作为一款开源软件成分分析工具,为技术决策者和架构师提供了一套完整的解决方案,通过深度依赖分析、漏洞检测和许可证合规检查,帮助企业构建安全可靠的软件供应链体系。 ## 挑战:开源依赖的隐性风险与治理困境 **问题场景:多技术栈依赖管理的复杂

gitblog_00492的博客 462

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

今日热门项目推荐:OpenSCA-cli - 用开源守护开源的安全卫士

今日热门项目推荐:OpenSCA-cli - 用开源守护开源的安全卫士 【免费下载链接】OpenSCA-cli OpenSCA 是一款开源的软件成分分析工具,用于扫描项目的开源组件依赖、漏洞及许可证信息,为企业及个人用户提供低成本、高精度、稳定易用的开源软件供应链安全解决方案。 ...

gitblog_01422的博客 793

3分钟快速上手OpenSCA:开源软件安全检测终极指南

开源软件成分分析是确保项目安全的重要环节。OpenSCA作为一款专业的开源软件供应链安全检测工具,能够快速扫描项目中的第三方组件依赖、漏洞及许可证信息。无论您是开发新手还是资深工程师,都能轻松掌握这款高效的安全检测解决方案。 ## 为什么选择OpenSCA进行软件成分分析 在当今的软件开发环境中,项目往往依赖于大量的开源组件。OpenSCA通过智能分析技术,帮助您: - **多语言全面覆盖*

gitblog_00534的博客 898

OpenSCA漏洞修复实战:AI供应链安全工具升级与DevSecOps实践

软件成分分析(SCA)是现代DevSecOps流程中的核心技术,通过自动化扫描识别项目依赖中的开源组件及其安全漏洞。其原理是基于依赖声明文件构建项目物料清单,并与漏洞数据库进行比对,从而发现潜在风险。这项技术的核心价值在于将安全左移,在开发早期阻断漏洞引入,尤其对云原生和AI驱动的应用至关重要。在AI原生场景下,模型文件、数据集和非标准包源成为新的供应链攻击面,使得SCA工具自身的安全性备受关注。本文围绕OpenSCA近期修复的路径遍历与权限校验绕过漏洞,深入解析其影响范围,并提供从版本升级、兼容性测试到C

weixin_33908217的博客 329

还在手动排查第三方依赖漏洞?OpenSCA开源SCA检测工具零基础上手

项目里塞了几百个依赖包,安全审计到底从哪下手?OpenSCA 是一款开源的软件成分分析(SCA)工具,说白了就是一款开源安全检测工具:把项目目录指给它,它自动识别包管理器、解析出依赖树,再逐个组件比对漏洞库和许可证,最后输出一份能直接看的报告。 ## 🧭 一、先看看它能干什么 这一节用半分钟把功能交代清楚,方便你判断它适不适合自己的场景。 ### 主流语言基本都覆盖 Java(Maven

gitblog_00874的博客 105

#AI原生安全【重要】OpenSCA迎来2026年首个漏洞修复通告

安全攻防是一场没有终点的长跑,如果您正在使用 OpenSCA-cli,请立即升级至 v3.0.9 及以上版本。OpenSCA-cli 是开发者手中的瑞士军刀,适合单兵作战。但在面对复杂的企业级治理与瞬息万变的 0-N Day 漏洞与供应链投毒威胁时,您可能需要更强大的武器库: 欢迎体验悬镜安全商业级解决方案:「源鉴 SCA — 基于多模态 SCA 的新一代开源供应链风险审查与治理平台」与「云脉 XSBOM — AI驱动的数字供应链安全情报预警服务」——不仅提供可视化的全生命周期风险治理,更以实时精准的供应链

weixin_64810147的博客 628
上一篇: 免费好用的开源组件安全风险排查工具:OpenSCA
下一篇: 透过安全事件看软件组成分析SCA
OpenSCA社区
博客等级 码龄4年 171粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值