我尝试在 1000 个公共 GitHub 存储库中查找 MongoDB 连接字符串

2025-06-07

我尝试在 1000 个公共 GitHub 存储库中查找 MongoDB 连接字符串

我尝试在 GitHub 上搜索一下,看看能不能找到其他人的 Mongo 数据库连接字符串。结果,我找到了几个。

我尝试连接几个,是的,成功了!

在你报警之前,先听听我的故事。🤗

可爱的狗警察

我正在开发一个 NodeJS/Express 应用程序进行练习,突然想起我把.env文件推送到了远程仓库。在修复这个错误的过程中,我琢磨着有多少人会犯这个错误,即使这些 secret 最终被取消暂存,它也会留在提交历史记录的某个地方。
于是,我上钩了,在GitHub 上搜索了一下。虽然大多数搜索结果都不是真正的连接字符串,但其中很多仍然有效并且正常运行。

[免责声明:无意造成伤害,仅用于提高公众意识]

我如何浏览 1000 个存储库

实际上,GitHub Search API 每次搜索最多只能搜索 1,000 条结果。使用下面的脚本,我能够生成包含以下代码的仓库:mongodb+srv:

// index.ts
import dotenv from "dotenv"
dotenv.config()

import axios from "axios";
import fs from "fs/promises";
import cliProgress from "cli-progress";

const jsonpath = "list_of_repo.json";

const makeSearch = async (page: number) => {
  const config = {
    headers: {
      Authorization: `Token ${process.env.GITHUB_API_TOKEN}`,
    },
  };

  const url = `https://api.github.com/search/code?q=mongodb%2Bsrv+in:file&page=${page}&per_page=100`;
  const result: {
    items: { html_url: string; repository: { html_url: string } }[];
  } = await axios.get(url, config);

  // make an an object from result
  let obj = {};
  result.data.items.forEach((item) => {
    obj[item.repository.html_url] = item.html_url;
  });

  await addToJson(jsonpath, obj);
};

async function addToJson(jsonpath: string, data?: object) {
  const oldJson = (await fs.readFile(jsonpath)).toString();
  let jsonData = JSON.stringify(data, null, 2);

  if (oldJson) {
    jsonData = JSON.stringify(
      { ...JSON.parse(oldJson), ...JSON.parse(jsonData) },
      null,
      2
    );
  }

  await fs.writeFile(jsonpath, jsonData);
}

async function main() {
    // I included a CLI progress loader because, who doesn’t like a loader.
  const bar1 = new cliProgress.SingleBar(
    {},
    cliProgress.Presets.shades_classic
  );
  // number of iteration 10
  bar1.start(10, 0);
  for (let i = 1; i <= 10; i++) {
    await makeSearch(i);
    bar1.update(1);
  }
  bar1.stop();
}

main();
Enter fullscreen mode Exit fullscreen mode

提供的结果并不意味着存在实际的 MongoDB 连接字符串,它仅意味着结果中的存储库具有匹配的文件内代码mongodb+srv:

我可以进一步创建一个脚本来搜索每个代码 URL,并运行正则表达式来进一步找到实际的连接字符串,但这不是必需的,因为我的目的是提高公众意识以及如何保护自己。

我的发现以及我们如何保护自己

我的一些发现包括:

  • 一些结果包括提交历史记录中的旧提交:就像我导致这篇文章的错误一样,有时我们忘记.gitignore在项目开始时创建文件,并且在提交历史记录中的某个地方保留一些秘密。

    我们可以利用GitGuardian之类的工具来持续扫描我们的 repo 以查找源代码中的秘密。

  • 一些结果包括来自不同日志文件和环境文件的消息:这可能是由于没有包括.gitignore.

    GitHub 提供了一个repo.gitignore ,其中包含适用于不同语言、框架、工具、IDE 等的多种类型的模板

    我创建了一个简单的交互式 CLI,.gitignore根据 GitHub 列表生成模板。

您可以在此处找到用于生成模板的交互式 CLI 工具.gitignorehttps://www.npmjs.com/package/gittyignore

感谢阅读!🤗

如果你喜欢读这篇文章,你可以考虑请我喝杯咖啡

文章来源:https://dev.to/zt4ff_1/i-tried-to-find-mongodb-connection-strings-over-1000-public-github-repositories-260k
PREV
使用 RobotJS 实现 NodeJS 桌面自动化(但这个程序可能会让你被录用或被解雇😄)
NEXT
为你的 Monorepo 创建 TypeScript CLI