1000 GithubリポジトリでMongoDB接続文字列を見つけました


私は、Github検索でそれを捜して他の人々Mongoデータベース接続ストリングを得ることができるかどうか見ました.はい、私はいくつかを見つけた.
私はいくつかのはいに接続しようとした、それは働いた!
あなたが私に警官を呼ぶ前に、私のバックストーリーを聞いてください.🤗

私は練習のためのNODEJS/Expressのアプリケーションに取り組んでいたと私は.env ファイルをリモートリポジトリに.このエラーを修正することに取り組んでいる間、私は多くの人々がこの誤りをしただろうと思いました、そして、秘密が最終的にunstagedされるとしても、それはコミット史のどこかにとどまりそうです.
それで、私は餌をとって、これを作りましたGitHub search . ほとんどの結果は実際の接続文字列ではありませんが、それらの良い数はまだ生きていて、機能的です.
[免責事項:害を意図しない、これは単に公共の意識を作成することです.”

どのように私は1000リポジトリをスキャン
実際にGitHub Search API limits to 1,000 results for each search . 以下のスクリプトを使用して、そのコードを含むリポジトリを生成できました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();
結果は、実際のMongoDB接続文字列が存在することを意味しません.結果のリポジトリがマッチするファイル内コードを持っていることを意味しますmongodb+srv:私はさらに、各コードURLを介して検索を実行するスクリプトを作成し、さらに正規の接続文字列を見つけるために正規表現を実行するスクリプトを作成することができますが、それは私の目的は、公共の意識とどのように自分自身を保護することです作成する必要はありません.

私が発見し、どのように自分自身を保護することができます
私の発見には、

  • いくつかの結果はコミットの歴史の古いコミットが含まれています:この記事につながった私のミスと同じように、時々我々は.gitignore プロジェクトの冒頭にファイルし、いくつかの秘密をどこかのコミットの歴史の中でステージがあります.
    我々は、ツールのように使用することができますGitGuardian 継続的に我々のソースコードの秘密のために我々のrepoをスキャンしてください.

  • いくつかの結果には、異なるログファイルと環境ファイルからのメッセージが含まれていました.gitignore.Githubは、Aを提供しますrepo 多数のタイプ.gitignore 異なる言語、フレームワーク、ツール、IDE e . c .のためのテンプレート.
    そして、私は生成する単純なインタラクティブなCLIを作成しました.gitignore GitHubリストに基づいてテンプレート.
  • あなたが生成するインタラクティブなCLIツールを見つけることができます.gitignore テンプレートはこちらhttps://www.npmjs.com/package/gittyignore
    を読んでくれてありがとう!🤗
    この記事を読むのを楽しむなら、あなたは考えることができますbuying me a coffee