node 拉取github开源漏洞

news2024/11/25 11:39:11

我们可以通过github的open api 来拉取一些信息。这里主要是拉取 github 开源漏洞中的漏洞信息

Github Explorer

github Explorer 是一个在线工具,登录之后,我们可以在左侧输入GraphQL 查询语句,之后就可以查询相关的信息。例如:
在这里插入图片描述

查询第一页

这里我们想要查询在github 开源的npm漏洞可以这么输入

{
  securityVulnerabilities(first: 100, ecosystem: NPM) {
    totalCount
    pageInfo {
      endCursor
      startCursor
    }
    nodes {
      advisory {
        identifiers {
          value
          type
        }
      }
      firstPatchedVersion {
        identifier
      }
      package {
        name
        ecosystem
      }
      severity
      updatedAt
      vulnerableVersionRange
    }
  }
}

这里是一个GraphQL语句,解释一下

  • first:100表查询前100个数据,用于分页
  • ecosystem:npm, 表查询的是npm生态的数据,这里也可以换成其他的生态比如maven
  • totalCount:用于获取数据的总条数,便于后续分页获取下一页数据
  • pageInfo:分页的信息,这里分页主要是使用该对象里面的startCursor,endCursor两个游标,类似SQL 查询是的从那一条开始查询。当我们确定开始游标时,再加上查询数量就可以查询下一页的数据了
  • nodes:这个就是返回的节点信息了

查询的结果如下:
请添加图片描述

查询下一页数据

上面是查询第一页的前100条数据,这里总计有3000+的数据,那我们就需要分页查询到所有的数据。分页的话,我们就需要获取前一页数据的最后的游标,将其作为下一页的起始游标查询。从pageInfo中的endcCursor就可以获取上一页数据的最后的游标值。在这里插入图片描述
我们讲GraphQL的语句修改成下面的

{
  securityVulnerabilities(first: 100, ecosystem: NPM, after: "Y3Vyc29yOnYyOpK5MjAyMi0xMi0yMlQwMjo1Mzo1NCswODowMM2STQ==") {
    totalCount
    pageInfo {
      endCursor
      startCursor
    }
    nodes {
      advisory {
        identifiers {
          value
          type
        }
      }
      firstPatchedVersion {
        identifier
      }
      package {
        name
        ecosystem
      }
      severity
      updatedAt
      vulnerableVersionRange
    }
  }
}

查询之后我们就查到了第二页的100条数据。
在这里插入图片描述

接口拉取

我们在实际应用中期望是在一个程序中获取数据,而不是每次手动的在这个工具网站中查询。
github 提供了一些open api,我么可以通过这些接口来获取想要的数据。

获取github token

需要先获取一个github的token,可以查看github的文档,按照上面的步骤一步步来就可以了github 获取token

http 拉取数据

不啰嗦直接附上代码

const axios = require('axios');
const fs = require('fs');

// 按照上述步骤从github 上获取的token
const accessToken = 'your token';
// 这部分内容就是GraphQL,其中的$page是为了查询分页加的占位符
const query = `
{
  securityVulnerabilities(
    first: 100
    ecosystem: NPM
    $page
  ) {
    totalCount
    pageInfo {
      endCursor
      startCursor
    }
    nodes {
      advisory {
        identifiers {
          value
          type
        }
      }
      firstPatchedVersion {
        identifier
      }
      package {
        name
        ecosystem
      }
      severity
      updatedAt
      vulnerableVersionRange
    }
  }
}`;

 const getNpmSecurityVulnerabilitiesPaging = async (afterCursor) => {
 // github graphql 的api
  const url = 'graphql';
  const method = 'POST';
  const baseURL = 'https://api.github.com/';
  const headers = {
    'Authorization': `Bearer ${accessToken}`,
    'Content-Type': 'application/json',
  };
  let queryStr = query;
  if (afterCursor) {
  	// 非第一页查询,标记查询起始游标
    queryStr = queryStr.replace('$page', `after: "${afterCursor}"`);
  } else {
  	// 第一页查询无需游标
    queryStr = queryStr.replace('$page', '');
  }
  const config = {
    url,
    method,
    baseURL,
    headers,
    data: JSON.stringify({query: queryStr}),
  };
  try {
    const rst = await axios(config);
    return rst.data.data.securityVulnerabilities;
  } catch (error) {
    console.log(error.message);
  }
 }
 const getSecurityVulnerabilitiesNpmList = async () => {
  const list = [];
  let afterCursor = null;
  let total = null;
  do {
    const securityVulnerabilities = await getNpmSecurityVulnerabilitiesPaging(afterCursor);
    const { totalCount, pageInfo, nodes} = securityVulnerabilities;
    if (!total) total = securityVulnerabilities.totalCount;
    afterCursor = pageInfo.endCursor;
    list.push(...nodes);
    console.log(`length: ${list.length} / ${total}; afterCursor: ${afterCursor}`);
  }while(list.length < total)
  console.log(list);
  // 将所有的数据输入到同目录下的data.json文件中
  fs.writeFileSync('./data.json', JSON.stringify(list))
 }
 // 获取开源漏洞列表
 getSecurityVulnerabilitiesNpmList()

在这里插入图片描述

漏洞详情信息

一般可以通过https://github.com/advisories/GHSA编号 来查看漏洞的详情。
每一个开源的漏洞也都有一个统一的编号简称是CVE(Common Vulnerabilities and Exposures) 这两个数据也是可以获取到的。如下:
在这里插入图片描述

参考资料

github open api
github 开源漏洞
github Explorer
github 文档
github 获取token

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/346200.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

B树和B+树,红黑树作为索引的区别

索引是一种数据结构&#xff0c;帮助我们在mysql表中更高效获取数据的数据结构 常用作为索引的数据结构&#xff1a;二叉树&#xff0c;红黑树&#xff0c;Hash表&#xff0c;B树&#xff0c;B树 下面的数据表中有两个字段&#xff0c;第一个字段是col1&#xff0c;第二个字段…

如何在Qt中设置背景图片,且不覆盖其它控件

正常情况&#xff0c;我们直接通过在样式表里设置背景图片会出现背景图片覆盖其它控件的情况&#xff0c;比如下面操作&#xff1a; 首先右击空白处&#xff0c;点击改变样式表。 然后选择background-image 然后点击铅笔图标 之后我们要先添加前缀&#xff0c;也就是我们…

使用 Three.js 后处理的粗略铅笔画效果

本文使用Three.js的后处理创建粗略的铅笔画效果。我们将完成创建自定义后处理渲染通道、在 WebGL中实现边缘检测、将法线缓冲区重新渲染到渲染目标以及使用生成和导入的纹理调整最终结果的步骤。翻译自Codrops&#xff0c;有改动。 Three.js 中的后处理 Three.js中的后处理是一…

1.9 实践项目——爬取学生信息

1. 项目简介设计一个 Web 服务器 server.py&#xff0c;它读取 students.txt 文件中的学生数据&#xff0c;以表格的形式呈现在网页上&#xff0c;其中 students.txt 的格式如下&#xff1a;No,Name,Gender,Age1001,张三,男,201002,李四,女,191003,王五,男,21设计一个客户端的爬…

【Junit5】就这篇,带你从入门到进阶

目录 前言 1.前置工作 2、注解 2、断言&#xff08;Assertions类&#xff09; 2.1、断言 匹配/不匹配 2.2、断言结果 为真/为假 2.3、断言结果 为空/不为空 3、用例的执行顺序 3.1、用例执行顺序是怎样的&#xff1f; 3.2、通过order注解来排序 4、参数化 4.1、单…

Firefox 110, Chrome 110, Chromium 110 官网离线下载 (macOS, Linux, Windows)

Mozilla Firefox, Google Chrome, Chromium, Apple Safari 请访问原文链接&#xff1a;https://sysin.org/blog/chrome-firefox-download/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.sysin.org 天下只剩三种&#xff08;主流&am…

feign技巧 - form方式传值

feign技巧 - form方式传值。 0. 文章目录1. 前言2. 调用样例3. 原理解析3.1 feign端序列化参数3.2 SpringMVC服务端解析参数3.3 补充 - 继承关系不会被传递的原因3.4 补充 - 不能使用GET。4. 总结1. 前言 直接正题。 如何使用feign进行fom表单方式的请求调用&#xff0c;以及其…

leaflet 上传KMZ文件,并在map上显示(062)

第062个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中本地上传包kmz文件,解析并在地图上显示图形。在制作本示例的过程中,还有点缺憾,就是kmz中的图片文件没有在jszip中处理好,只能先解压缩后,将图片文件放到public/文件加下,暂时留一个遗憾点,以后再做…

又发现一个ChatGPT体验站,辅助写代码真方便

♥️ 作者&#xff1a;Hann Yang ♥️ 主页&#xff1a;CSDN主页 ♥️ 2022博客之星Top58&#xff0c;原力榜Top10/作者周榜Top13 ♥️ “抢走你工作的不会是 AI &#xff0c;而是先掌握 AI 能力的人” ChatGPT 美国OpenAI研发的聊天机器人程序&#xff0c;于2022年11月30日发…

【刷题笔记】--两数之和Ⅳ,从二叉树中找出两数之和

法一&#xff1a;深度搜索中序遍历双指针 思路&#xff1a;通过中序遍历二叉树得到一个递增的数列&#xff0c;再在这个递增的二叉树中找到这两数。 主要学到双指针这个方法。 对于一般数列&#xff0c;我们要找到两数满足其之和等于目标数&#xff0c;我们一般会进行暴力&a…

C++请求SpringBoot的接口问题记录

问题描述最近忙一个小东西&#xff0c;遇到一个很有意思的问题&#xff0c;记录一下。 需求非常简单&#xff0c;就是java侧提供一个接口给C侧调用。 接口按照业务规范提供出来了&#xff0c;在postman中请求一下&#xff0c;出入参都正常。 关于这个接口请求方式为postJson方式…

C++:提高篇: 栈-寄存器和函数状态:栈指针帧指针详解

栈指针和帧指针前言1、EBP和ESP详解2、push &#xff0c;leave &#xff0c;call汇编指令分析3、下面用一个图总结前言 &#x1f697;&#x1f697;&#x1f697;&#xff1a;在刚接触 ESP和EBP概念时&#xff0c;我一直认为&#xff1a;ESP指向栈顶指针&#xff0c;EBP指向栈…

为什么说百度下个月推出文心一言会被ChatGPT完全碾压

作者&#xff0c;姚远&#xff1a; Oracle ACE&#xff08;Oracle和MySQL数据库方向&#xff09;华为云MVP 《MySQL 8.0运维与优化》的作者中国唯一一位Oracle高可用大师拥有包括 Oracle 10g和12c OCM在内的20数据库相关认证。曾任IBM公司数据库部门经理现在一家第三方公司任首…

操作系统——2.操作系统的特征

这篇文章&#xff0c;我们来讲一讲操作系统的特征 目录 1.概述 2.并发 2.1并发概念 2.1.1操作系统的并发性 3.共享 3.1共享的概念 3.2共享的方式 4.并发和共享的关系 5.虚拟 5.1虚拟的概念 5.2虚拟小结 6.异步 6.1异步概念 7.小结 1.概述 上一篇文章&#xff0c;我们…

实时数据仓库

1 为什么选择kafka? ① 实时写入&#xff0c;实时读取 ② 消息队列适合&#xff0c;其他数据库受不了 2 ods层 1&#xff09;存储原始数据 埋点的行为数据 (topic &#xff1a;ods_base_log) 业务数据 (topic &#xff1a;ods_base_db) 2&#xff09;业务数据的有序性&#x…

论文阅读 - Early Detection of Fake News by Utilizing the Credibility of News

论文链接&#xff1a;https://arxiv.org/pdf/2012.04233.pdf 目录 摘要 1 简介 2 相关工作 2.1 基于特征的方法 2.2 深度学习方法 3 问题表述 4 拟议的框架 4.2 用户可信度预测 4.3 虚假新闻分类 4.3.1 新闻内容表示 4.3.2 融合注意力单元 5 实验 5.1 数…

工厂模式--设计模式

分类&#xff1a; 1、简单工厂&#xff1a;可根据自变量的不同返回不同类的实例 应用&#xff1a;将类名和类的全路径放入到配置文件&#xff0c;通过文件流将内容读取放入到map集合中保存&#xff0c;通过反射读取类全路径读取到该类&#xff0c;然后调用类方法。 详细设计&…

山东大学2022算法期末

接力&#xff1a;山东大学2021算法期末 2022 SDU算法导论期末考试 2020 计科 计算题 三道 35’ (1) 画BFS树 (2) 做DFS说明各种边的分类使用floyd或者矩阵乘法求全源最短路&#xff0c;求最短路矩阵以及前驱矩阵&#xff08;3个点&#xff0c;比较友好&#xff0c;应该没有…

idea推送镜像到desktop报错:Cannot run program “docker-credential-desktop“ 系统找不到指定的文件。

windows Docker 搭建仓库 打开docker desktop 。 打开windows cmd窗口或powershell窗口。 输入"docker run -d -p 5000:5000 --name test registry:2 "运行一个名字叫test的registry容器。 idea配置springboot项目的docker插件 在pom.xml中的plugins中加入下面代码…

Kaldi语音识别技术(五) ----- 特征提取

Kaldi语音识别技术(五) ----- 特征提取 文章目录Kaldi语音识别技术(五) ----- 特征提取一、识别流程二、MFCC特征提取概述三、文件格式文件格式说明提取部分数据修复提取数据提取剩余部分数据四、特征提取特征提取—C特征提取—并行提取特征提取—特征查看五、CMVNCMVN—脚本CM…