依赖 漏洞扫描 API
一次调用即可对最多 50 个开源依赖执行 OSV.dev 检查,返回 CVE 编号、计算得出的 CVSS 基础分、CWE 分类,以及修复每条公告的确切版本号。
集成指南
复制代码片段,替换你的 API 密钥,运行即可。适用于任何 HTTP 客户端——下方提供 cURL、JavaScript 和 Python 示例。
/api/scan-dependencieshttps://www.apipick.comCheck open-source packages against the OSV.dev vulnerability database
packagesarray必填Up to 50 objects, each with ecosystem, name, and an exact installed version. [{"ecosystem":"npm","name":"lodash","version":"4.17.15"}]
curl -X POST "https://www.apipick.com/api/scan-dependencies" \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"packages": [
{
"ecosystem": "npm",
"name": "lodash",
"version": "4.17.15"
},
{
"ecosystem": "PyPI",
"name": "requests",
"version": "2.19.0"
}
]
}'{
"summary": {
"packages_scanned": 2,
"vulnerable_packages": 2,
"total_vulnerabilities": 8,
"by_severity": {
"critical": 1,
"high": 3,
"medium": 4,
"low": 0,
"none": 0,
"unknown": 0
},
"highest_cvss_score": 9.8
},
"results": [
{
"ecosystem": "npm",
"name": "lodash",
"version": "4.17.15",
"vulnerable": true,
"highest_severity": "HIGH",
"highest_cvss_score": 7.4,
"vulnerability_count": 6,
"vulnerabilities": [
{
"id": "GHSA-35jh-r3h4-6jhm",
"aliases": [
"CVE-2021-23337"
],
"cve": "CVE-2021-23337",
"summary": "Command Injection in lodash",
"severity": "HIGH",
"cvss_score": 7.2,
"cvss_vector": "CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H",
"cwe_ids": [
"CWE-77"
],
"published": "2021-02-15T00:00:00Z",
"fixed_versions": [
"4.17.21"
],
"advisory_url": "https://osv.dev/vulnerability/GHSA-35jh-r3h4-6jhm"
}
],
"error": null
}
],
"source": "OSV.dev (Google Open Source Vulnerabilities, CC-BY-4.0)",
"credits_used": 5,
"remaining_credits": 95
}为真实场景而生
发布卡点
当任一依赖超过设定的 CVSS 阈值时中断构建。有了数值分数,策略就是一行数值比较,而不必去匹配字符串。
编码智能体
让智能体在把某个版本写进依赖清单之前先行核查,并在同一轮对话中给出应升级到的修复版本。
Lockfile 审计
把整份依赖清单按 50 个一批提交,为每个服务得到一份按严重级别汇总的报告,无需在 CI 中另跑扫描器。
供应商尽职调查
在签约前用可溯源的公开漏洞数据,对第三方申报的依赖清单进行风险评分。
响应字段
| 字段 | 类型 | 说明 |
|---|---|---|
| summary.vulnerable_packages | integer | 所提交的依赖包中,至少命中一条漏洞公告的数量 |
| summary.by_severity | object | 按 critical / high / medium / low / none / unknown 分级的公告数量 |
| summary.highest_cvss_score | number | null | 本次扫描中出现的最高 CVSS 基础分 |
| results[].vulnerable | boolean | 该版本是否存在未撤回的漏洞公告 |
| results[].vulnerabilities[].id | string | OSV 公告编号,例如 GHSA-35jh-r3h4-6jhm |
| results[].vulnerabilities[].cve | string | null | 对应的 CVE 编号(若存在) |
| results[].vulnerabilities[].severity | string | CRITICAL、HIGH、MEDIUM、LOW、NONE 或 UNKNOWN |
| results[].vulnerabilities[].cvss_score | number | null | 依据公告中的向量串计算出的 CVSS v3.1 基础分 |
| results[].vulnerabilities[].cwe_ids | string[] | 该公告对应的 CWE 弱点分类 |
| results[].vulnerabilities[].fixed_versions | string[] | 可修复该公告的本包版本 |
| results[].error | string | null | 该依赖单独查询失败时出现;其余依赖仍会正常返回 |
| credits_used | integer | 本次请求扣除的积分 |
| remaining_credits | integer | 你账户中剩余的积分 |
速率限制
限流按 API 密钥计,采用 60 秒滑动窗口。触发限制时会返回干净的 429,并带 Retry-After 响应头。
20req/min
按 API 密钥、按端点计。60 秒滑动窗口。
3concurrent
每个 API 密钥的最大同时进行中请求数。
X-RateLimit-Limit每分钟允许的最大请求数X-RateLimit-Remaining当前窗口内剩余的请求数X-RateLimit-Reset当前窗口重置前的秒数Retry-After重试前需等待的秒数(仅在 429 时)HTTP/1.1 429 Too Many Requests
Retry-After: 12
X-RateLimit-Limit: 20
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 12
{
"error": "rate_limit_exceeded",
"message": "Rate limit exceeded: 20 requests/minute per API key. Retry after 12s.",
"retry_after": 12
}数据来源与授权
漏洞公告来自 Google 的开源漏洞数据库 OSV.dev,以 CC-BY-4.0 协议发布。OSV 把 GitHub Advisory Database、Go 漏洞库、RustSec、PyPA 以及各主流发行版的安全跟踪库统一到同一套 schema 中。我们在此基础上补充了 CVSS 基础分计算与按包汇总。
常见问题
问: 漏洞数据来自哪里?
答: 来自 Google 的开源漏洞数据库 OSV.dev。它把 GitHub Advisory Database、Go 漏洞库、RustSec、PyPA 以及各发行版的安全跟踪库汇总为同一套 schema,并以 CC-BY-4.0 协议发布。新公告通常在发布后数小时内即可查到。
问: CVSS 分数是怎么算出来的?
答: OSV 公告只带 CVSS 向量串,不带数值。我们按官方公式从该向量计算 CVSS v3.1 基础分,因此你拿到的是可以直接用来设阈值的数字。若某条公告没有 v3 向量(只有 v4,或某些生态公告本身未提供),cvss_score 为 null,severity 则回退到发布方自己给出的评级。
问: 可以扫描整个 lockfile 吗?
答: 可以 —— 在你这边解析后,每次最多提交 50 个包。无论一次带多少个包,单次调用都是 5 积分,因此 50 个一批相当于每个包 0.1 积分。依赖更多时按 50 个一批拆分即可。
问: 支持版本范围吗?
答: 不支持。请按 lockfile 中的写法提交确切的已安装版本(4.17.15,而不是 ^4.17.0)。OSV 是拿具体版本去比对受影响范围来判定的,因此传入一个范围本身并没有唯一答案。
问: 如果其中一个包查询失败会怎样?
答: 扫描照常返回结果。该包会带上 error 字段并从汇总计数中排除,其余依赖一切照常。响应还会带上 packages_failed,让你知道这份汇总并不完整。