技术文档 | OpenSCA技术原理之composer依赖解析

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 本文主要介绍基于composer包管理器的组件成分解析原理。

OpenSCA知识小课堂开课了!

今天主要介绍基于composer包管理器的组件成分解析原理。

composer介绍

composer是PHP的依赖管理工具。

开发者受到Node.js的npm及Ruby的bundler启发,composer设计上与两者有诸多相似。

composer的依赖管理文件是composer.json。开发者可以在composer.json中指定每个依赖项的版本范围或使用composer require/update/remove ${name}命令管理依赖项。

如果一个项目中存在composer.json文件,便可以执行composer install命令自动安装当前项目所需的依赖项并生成composer.lock文件

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

{
  "name": "cakephp/app",
  "type": "project",
  "license": "MIT",
  "require": {
      "php": ">=7.2",
      "cakephp/cakephp": "^4.3",
      "cakephp/migrations": "^3.2",
      "cakephp/plugin-installer": "^1.3",
      "mobiledetect/mobiledetectlib": "^2.8"
  },
  "require-dev": {
      "cakephp/bake": "^2.6",
      "cakephp/cakephp-codesniffer": "^4.5",
      "cakephp/debug_kit": "^4.5",
      "josegonzalez/dotenv": "^3.2",
      "phpunit/phpunit": "~8.5.0 || ^9.3"
  },
}

其中name为项目名称;type为包的类型,有library、project、metapackage和composer-plugin四种类型,默认情况下为library;license为项目声明的许可证,可以是一个字符串或是一个字符串数组。

require-dev为开发环境或测试使用的依赖,require为生产环境使用的依赖,依赖写法为"name":"version",版本可以指定准确版本或一个范围。

解析算法

composer.lock

composer.lock文件为自动生成的文件,可以准确定位到PHP项目使用的依赖及版本,所以优先解析composer.lock文件。

composer.lock文件结构如下:

{
  "packages": [
    {
      "name": "a",
      "version": "1.1.0",
      "require": {
          "c": "1.1.*"
      }
    },
    {
      "name": "b",
      "version": "1.2.2",
      "require": {
          "c": "^1.0.2"
      }
    },
    {
       "name": "c",
      "version": "1.1.2"
    }
  ],
  "packages-dev": []
}

其中packages和packages-dev字段包含项目使用的所有直接和间接依赖,而且记录了组件间的依赖关系,packages为生产环境的依赖,packages-dev为开发环境的依赖。

示例:

{
  "name": "a",
  "version": "1.1.0",
  "require": {
      "c": "1.1.*"
  }
}

代表项目依赖1.1.0版本的组件a,且该组件依赖版本约束为1.1.*的组件c。

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

且组件a和组件b都没有被其他依赖所依赖,所以可知这两个组件是项目的直接依赖。

注:

  • 1.1.*代表版本号需要>=1.1.0且<1.2.0
  • ^1.0.2代表版本号需要>=1.0.2且<2.0.0

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

180a4c27d867c801d0333086ba44e6ff.png


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

d02aa6d915311b99602e170ac5c8baaf.png

图:composer.lock检测结果示例

composer.json

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

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

composer.json文件结构如下:

{
  "name": "foo",
  "type": "project",
  "license": "MIT",
  "require": {
      "a": "^1.1.0",
      "b": "^1.2.0",
  },
  "require-dev": {},
}

require为项目实际使用的直接依赖,require-dev为项目开发时使用的直接依赖。

例如:

"a": "^1.1.0"代表项目依赖版本约束为^1.1.0的组件a。

"b": "^1.2.0"代表项目依赖版本约束为^1.2.0的组件b。

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

78b4d76ae473a502e1281399655494e2.png


实线代表直接依赖

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

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

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

{
  "packages": {
    "a": [
      {
        "version": "1.0.1",
        "require": {
          "c": "^1.0.0"
        }
      },
      {
        "version": "1.1.0",
        "require": {
          "c": "^1.1.0"
        }
      }
    ]
  }
}

其中packages字段为组件及各个版本信息的映射,require字段为组件的依赖信息。

对于本例来说,组件a的约束为^1.1.0,要求版本号>=1.1.0且<2.0.0,所以选择1.1.0版本。

因此组件依赖结构就变成了:

b04f017d89959ad63b3fb96dcaeb0f8a.png

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

图:composer.json检测结果示例


感谢每一位开源社区成员对OpenSCA的支持和贡献。

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

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

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

OpenSCA官网:
https://opensca.xmirror.cn/

联系我们

添加小助手(微信号:opensca1)加入OpenSCA社区技术交流群

或关注公众号:OpenSCA社区

相关文章
|
1月前
|
机器学习/深度学习 人工智能 算法
模型无关的局部解释(LIME)技术原理解析及多领域应用实践
在当前数据驱动的商业环境中,人工智能(AI)和机器学习(ML)已成为各行业决策的关键工具,但随之而来的是“黑盒”问题:模型内部机制难以理解,引发信任缺失、监管合规难题及伦理考量。LIME(局部可解释模型无关解释)应运而生,通过解析复杂模型的个别预测,提供清晰、可解释的结果。LIME由华盛顿大学的研究者于2016年提出,旨在解决AI模型的透明度问题。它具有模型无关性、直观解释和局部保真度等优点,在金融、医疗等领域广泛应用。LIME不仅帮助企业提升决策透明度,还促进了模型优化和监管合规,是实现可解释AI的重要工具。
78 9
|
19天前
|
供应链 安全 分布式数据库
探索区块链技术:从原理到应用的全面解析
【10月更文挑战第22天】 本文旨在深入浅出地探讨区块链技术,一种近年来引起广泛关注的分布式账本技术。我们将从区块链的基本概念入手,逐步深入到其工作原理、关键技术特点以及在金融、供应链管理等多个领域的实际应用案例。通过这篇文章,读者不仅能够理解区块链技术的核心价值和潜力,还能获得关于如何评估和选择适合自己需求的区块链解决方案的实用建议。
37 0
|
3月前
|
机器学习/深度学习 自然语言处理 自动驾驶
【深度学习】深度学习的详细解析:涵盖定义、技术原理及应用场景
深度学习(Deep Learning)是机器学习(Machine Learning)的一个重要分支,它通过使用多层的神经网络来模拟人脑的学习过程,从而实现对数据的分析和理解。以下是关于深度学习的详细解析
197 2
|
3月前
|
Java 测试技术 数据库
容器镜像解析问题之解析 Java 应用依赖时识别 jar 包如何解决
容器镜像解析问题之解析 Java 应用依赖时识别 jar 包如何解决
27 0
|
5月前
|
存储 安全 Java
2024ide构建maven项目是总是卡在解析Maven依赖项目 加速方案
2024ide构建maven项目是总是卡在解析Maven依赖项目 加速方案
242 4
2024ide构建maven项目是总是卡在解析Maven依赖项目 加速方案
|
3月前
|
安全 Nacos 数据安全/隐私保护
【技术干货】破解Nacos安全隐患:连接用户名与密码明文传输!掌握HTTPS、JWT与OAuth2.0加密秘籍,打造坚不可摧的微服务注册与配置中心!从原理到实践,全方位解析如何构建安全防护体系,让您从此告别数据泄露风险!
【8月更文挑战第15天】Nacos是一款广受好评的微服务注册与配置中心,但其连接用户名和密码的明文传输成为安全隐患。本文探讨加密策略提升安全性。首先介绍明文传输风险,随后对比三种加密方案:HTTPS简化数据保护;JWT令牌减少凭证传输,适配分布式环境;OAuth2.0增强安全,支持多授权模式。每种方案各有千秋,开发者需根据具体需求选择最佳实践,确保服务安全稳定运行。
319 0
|
6月前
|
存储 算法 Java
深入解析Java虚拟机(JVM):技术原理与性能优化
深入解析Java虚拟机(JVM):技术原理与性能优化
90 1
|
5月前
|
Linux 数据处理 开发者
Linux命令ldd:深入解析动态链接器依赖关系
`ldd`是Linux下分析可执行文件动态依赖的工具,它揭示了程序运行所需的共享库。通过模拟动态链接过程,`ldd`列出库文件路径,帮助理解程序环境和解决运行时问题。主要参数包括`-d`、`-r`、`-u`和`-v`。例如,`ldd my_program`展示`my_program`的依赖关系。注意,`ldd`不显示间接依赖,完整依赖树可能需借助其他工具。确保系统库完整且版本兼容是使用`ldd`时的关键。
|
6月前
|
传感器 vr&ar 计算机视觉
增强现实(AR)技术原理深度解析
【5月更文挑战第5天】本文深度解析了增强现实(AR)技术原理,包括图像识别与跟踪、三维注册技术和显示技术,并探讨了AR在游戏、教育、工业和医疗等领域的广泛应用。尽管面临准确性、成本和隐私等挑战,但随着技术进步,AR将在更多领域发挥关键作用,展现其潜力和价值。
|
3天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
16 2