NIST API速率限制疑问及异步请求报403错误咨询
NIST NVD API 请求频率规则与403报错排查
合规请求频率说明
两个规则不存在矛盾,适用场景不同:
- 标称的持有API key可60秒窗口内发100次请求是峰值熔断阈值,不是给自动化脚本设置的允许请求频率,这个阈值是为了覆盖人工操作、偶发批量请求的突发场景,避免正常用户被误限。
- 文档要求的脚本两次请求间隔≥6秒是自动化请求的强制规则,换算下来合规频率是10次/分钟,所有无人值守的脚本都必须遵守这个间隔要求,哪怕你持有有效API key,也不能尝试打满100次/分钟的峰值阈值,否则会触发管理层面的拦截。
24次异步请求触发403的具体原因
返回Request forbidden by administrative rules不是计数限流触发的,是前端WAF(Web应用防火墙)的管理规则拦截,常见触发原因有三个:
- 异步并发突发请求触发拦截:NVD API的计数限流和WAF拦截是两套独立规则,哪怕你总请求数远低于60秒100次的阈值,只要在极短时间内发起并发请求(比如用aiohttp默认并发配置时,24次请求可能在1-2秒内就全部发出去了),就会被判定为恶意爬取/扫描流量,直接返回403。
- API key传参方式错误:带key的请求必须把key放在请求头的
apiKey字段中,如果你把key拼在URL参数里、或者字段名写错(比如写成api_key、apikey),系统会把你识别为无key用户,无key用户的拦截阈值极低,且限流规则是30秒内最多5次请求,很容易触发403。 - 请求头缺失合法User-Agent:aiohttp默认的请求头UA会被WAF识别为恶意扫描工具,直接拦截请求,和请求频率无关。
可直接复用的合规请求示例
import asyncio import aiohttp # 替换为你自己申请的有效API key API_KEY = "your_nvd_api_key" NVD_API_ENDPOINT = "https://services.nvd.nist.gov/rest/json/cves/2.0" async def get_cve_by_cpe(cpe_str: str, session: aiohttp.ClientSession): req_params = {"cpeName": cpe_str} req_headers = { "apiKey": API_KEY, # 替换为合法的UA标识即可,不需要和示例完全一致 "User-Agent": "NVD-CVE-Collector/1.0 (internal research use)" } async with session.get(NVD_API_ENDPOINT, params=req_params, headers=req_headers) as resp: if resp.status != 200: resp.raise_for_status() return await resp.json() async def batch_fetch_cve(cpe_list: list[str]): # 强制限制并发数为1,避免突发请求 conn = aiohttp.TCPConnector(limit=1) async with aiohttp.ClientSession(connector=conn) as session: all_results = [] for cpe in cpe_list: cve_data = await get_cve_by_cpe(cpe, session) all_results.append(cve_data) # 间隔设置为6.1秒,避免网络波动导致实际间隔不足6秒 await asyncio.sleep(6.1) return all_results
注意:不要尝试通过多线程、缩短休眠时间的方式提升请求速度,持续触发WAF拦截会导致你的API key被临时甚至永久封禁,没有申诉通道。
内容的提问来源于stack exchange,提问作者Taylor B
相关产品推荐
相关产品推荐

