3rd 方站点如何生成构建/代码覆盖率徽章?

How are build / code coverage badges generated by 3rd-party sites?

我的工作设置包括公司托管的 Github 企业服务器和 Azure Devops 管道。通过像 shields.io 这样的网站,我可以生成构建成功或代码覆盖率的徽章,似乎无需通过 DevOps 验证自己。徽章然后托管在 shields.io 上,这意味着这个第 3 方站点必须以某种方式访问​​我的构建过程。它们看起来像这样:

由于 github 以及所有构建管道显然都是公司内部的,我可以看到三个选项如何工作:

  1. 即使管道和所有内容都是私有的,构建成功状态也会在整个网络上公开托管。这是设计使然,因为它实际上并未被视为安全风险。了解我的内部项目的 Organization/ProjectName/DefinitionID 无能为力。

  2. 这不应该发生,有些配置错误。我的设置中可能存在漏洞。

  3. 正在进行某种我不知道的身份验证形式,例如只要我的浏览器登录到 Azure,我就只能看到徽章(不太可能,它似乎也可以在私人模式下工作)

我在网上或 Whosebug 上找不到与此相关的任何信息。如果有任何资源对此进行解释,我会很高兴,因为我不确定我是否可以安全地使用它们。使用 shields.io 是否存在安全风险?

像你提到的徽章通常只是没有信息的空白 SVG 图片(你可以看看templates here)。

因此,对于创建 SVG(或 PNG)的服务:

  • 服务通过某种CI系统
  • 从您那里获取更新数据
  • 该服务生成附加到特定 GET 端点的相应图像(SVG 或 PNG)

服务有两种实现方式:

  • 使用 shields.io 作为一项服务,向他们的 JSON endpoint
  • 发送包含如何生成图像的信息的 JSON
  • 使用 shields.io 作为库或通过任何自定义方式在内部实现图像生成。

因此,无论哪种方式,具有徽章的 SaaS 应用程序通常会自行为它们提供服务(即使它们在内部调用 shields.io)。这意味着每项服务都可以自行实施任何安全措施。

传递给shields.io的数据通常包括两个词和一些颜色。因此,不会为了生成徽章而暴露太多信息(请参见下面的示例)。此外,服务与 shields.io 之间的通信已加密并通过 HTTPS 发送。

为了隐私,一个例子是大公司通常拥有只能在内部访问的托管解决方案,因此徽章也只能在内部访问。

您的问题中特别包含的徽章仅包含 public 来自应用程序商店或 GitHub 项目等的明星数据,通常 public 只要项目本身是public。这些徽章经常使用 shields.io API 使用 public 数据自动生成它们。

但是如果您查看 Coveralls 或 Travis 等物品的徽章,您会发现它们拥有自己的徽章:

  • <img src="https://travis-ci.org/Kibibit/achievibit.svg?branch=master">

  • <img src="https://coveralls.io/repos/github/Kibibit/achievibit/badge.svg?branch=master">

这是一个关于如何使用 shields.io 作为库创建徽章并提供徽章的打字稿小示例:

首先,安装gh-badges

npm i gh-badges --save

这就是您的使用方式:

import { BadgeFactory } from 'gh-badges';

(async () => {
  const bf = new BadgeFactory();

  const format = {
    format: 'svg',
    text: [ 'coverage', '90%' ],
    labelColor: '#894597',
    color: '#5d5d5d',
    template: 'for-the-badge',
    logo: [
      'data:image/png;base64,iVBORw0KGgoAAAA',
      'NSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJL',
      'R0QA/wD/AP+gvaeTAAAA/0lEQVRYhe3WMU7DM',
      'BjFcadqh0qdWWBl7QU4Ss/AjsREF8RdOhYO0E',
      'qoN2DhFIgBOvBjIIMVxSFyUiEhP8lD7C/v/T9',
      '7sEMoKkoIe+Npn8qpOgCM2VBVVa1ZkzFDcjQd',
      'apDqLIR+u/jnO1AACkABKABdAO9DjHEWfb7lA',
      'LwOAQghXPXx6gJ4zE3GJIRwE0095Zhc4PO3iz',
      '7x7zoq+cB5bifr9tg0AK7xFZXcZYXXZjNs+wB',
      'giofG8hazbIDaeI5dFwAu8dxY2mE+KDyCWGCT',
      'YLj3c86xNliMEh5BVLjFseNEjnVN8pU0BsgSh',
      '5bwA5YnC25AVFjhpR6rk3Zd9K/1Dcae2pUn6m',
      'qiAAAAAElFTkSuQmCC'
    ].join('')
  };

  return bf.create(format);
})();

这与作为上述服务端点发送到 shields.io 的数据基本相同。

您可以在控制器上下文中查看完整示例 here and here

关于它的风险,多想想这里到底暴露了什么数据。几乎什么都没有。如果您担心数据隐私,您可以自己生成徽章并提供给它们,或者根据需要将它们私密地嵌入 ;-)