
这是一个专业的GitHub仓库安全扫描工具,专门用于检测React和Next.js项目中的已知安全漏洞。脚本可直接在浏览器控制台中运行,无需本地安装,提供便捷的交互式扫描体验。
settings, explore等),提高扫描效率。REQUEST_DELAY_MS, SCAN_DELAY_MS),避免触发GitHub API频率限制。https://github.com)。F12 或 Ctrl+Shift+I (Windows) / Cmd+Option+I (Mac)。F12 或 Ctrl+Shift+K (Windows) / Cmd+Option+K (Mac)。main.js的内容)全部复制。Enter 执行。OK 并输入你的GitHub个人访问令牌(PAT)以扫描私有仓库;点击 Cancel 则仅扫描公开仓库。https://github.com/settings/tokens,生成一个具有repo范围权限的新令牌。执行脚本后,它将通过GitHub API获取仓库列表,并检查每个仓库的依赖文件(如package.json)。核心逻辑是解析dependencies和devDependencies中的版本号,并与已知的易受攻击版本范围进行比对。
典型输出报告示例:
扫描完成后,控制台会输出类似以下结构的报告,清晰列出发现的问题。
// 示例输出结构
{
"scannedUser": "exampleUser",
"totalRepos": 42,
"vulnerableRepos": 2,
"vulnerabilities": [
{
"repo": "my-react-app",
"url": "https://github.com/exampleUser/my-react-app",
"cve": "CVE-2025-55182",
"affectedPackage": "react",
"version": "19.1.0",
"fixedIn": ["19.1.2", "19.2.1"]
},
{
"repo": "nextjs-project",
"url": "https://github.com/exampleUser/nextjs-project",
"cve": "CVE-2025-66478",
"affectedPackage": "next",
"version": "15.0.4",
"fixedIn": ["15.0.5", "15.1.9"]
}
]
}根据报告,您可以:
以下是项目中的部分核心功能代码,展示了版本比对和漏洞检查的核心逻辑。
/**
* 将版本字符串解析为语义化版本对象
* @param {string} versionStr - 版本字符串 (如 "19.1.0")
* @returns {SemanticVersion|null} 解析后的版本对象或null
*/
function parseSemanticVersion(versionStr) {
if (!versionStr || typeof versionStr !== 'string') return null;
// 清理版本号前的特殊字符 (如 ^, ~, >=)
const cleanStr = versionStr.replace(/[^0-9.]/g, '');
const parts = cleanStr.split('.').map(Number);
if (parts.length < 3 || parts.some(isNaN)) return null;
return { major: parts[0], minor: parts[1], patch: parts[2] };
}
/**
* 检查给定的React版本是否受CVE-2025-55182影响
* @param {SemanticVersion} version - 要检查的版本
* @returns {boolean} 如果易受攻击则为true
*/
function isReactVulnerableToCVE202555182(version) {
// 精确匹配受影响的版本:19.0.0, 19.1.0, 19.1.1, 19.2.0
const vulnerableVersions = [
{ major: 19, minor: 0, patch: 0 },
{ major: 19, minor: 1, patch: 0 },
{ major: 19, minor: 1, patch: 1 },
{ major: 19, minor: 2, patch: 0 }
];
return vulnerableVersions.some(v =>
v.major === version.major &&
v.minor === version.minor &&
v.patch === version.patch
);
}
/**
* 检查给定的Next.js版本是否受CVE-2025-66478影响
* @param {SemanticVersion} version - 要检查的版本
* @returns {boolean} 如果易受攻击则为true
*/
function isNextVulnerableToCVE202566478(version) {
// 主要检查逻辑:影响15.x和16.x系列,但排除已修复的特定补丁版本
if (version.major === 15) {
// 15.x系列,检查是否低于安全版本
// 逻辑简化示例:实际代码包含更复杂的范围匹配
return version.minor >= 0 && version.patch < 5; // 示例条件
}
if (version.major === 16) {
return version.minor === 0 && version.patch < 7; // 示例条件
}
// 检查14.3 canary版本
if (version.major === 14 && version.minor === 3) {
// 需检查canary版本号,此处逻辑简化
return true;
}
return false;
}
/**
* 扫描单个仓库的package.json以查找漏洞
* @param {string} owner - 仓库所有者
* @param {string} repo - 仓库名
* @param {string} authToken - GitHub认证令牌
* @returns {Promise<Array>} 发现的漏洞列表
*/
async function scanRepository(owner, repo, authToken) {
const findings = [];
try {
// 构建获取package.json的URL
const packageJsonUrl = `${GITHUB_RAW}/${owner}/${repo}/HEAD/package.json`;
const headers = authToken ? { 'Authorization': `token ${authToken}` } : {};
const response = await fetch(packageJsonUrl, { headers });
if (!response.ok) return findings;
const packageJson = await response.json();
const deps = { ...packageJson.dependencies, ...packageJson.devDependencies };
// 检查React相关包
const reactPackages = ['react', 'react-dom', 'react-server-dom-webpack', 'react-server-dom-parcel', 'react-server-dom-turbopack'];
for (const pkg of reactPackages) {
if (deps[pkg]) {
const version = parseSemanticVersion(deps[pkg]);
if (version && isReactVulnerableToCVE202555182(version)) {
findings.push({
type: 'CVE-2025-55182',
package: pkg,
version: deps[pkg],
repository: `${owner}/${repo}`
});
}
}
}
// 检查Next.js
if (deps['next']) {
const version = parseSemanticVersion(deps['next']);
if (version && isNextVulnerableToCVE202566478(version)) {
findings.push({
type: 'CVE-2025-66478',
package: 'next',
version: deps['next'],
repository: `${owner}/${repo}`
});
}
}
} catch (error) {
console.error(`Error scanning ${owner}/${repo}:`, error);
}
// 添加请求延迟以避免速率限制
await new Promise(resolve => setTimeout(resolve, REQUEST_DELAY_MS));
return findings;
}以上代码展示了项目的核心功能:
parseSemanticVersion 函数负责清理和标准化版本字符串。isReactVulnerableToCVE202555182 和 isNextVulnerableToCVE202566478 函数包含精确的版本匹配逻辑,用于判断特定版本是否在受影响范围内。scanRepository 函数是主要工作流程,它获取仓库的 package.json,合并依赖项,并调用检测函数进行分析。它内置了错误处理和请求延迟,确保稳定运行。通过组合这些函数,脚本能够系统性地遍历Git仓库并生成准确的安全评估报告。
6HFtX5dABrKlqXeO5PUv/42PiQmycmCbEdeLe8FrQrY=
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。