⚠️

GitHubにファイル(画像、動画など)を添付したことがありますか?それらは誰でも閲覧することができます。

2023/05/18に公開

※この記事は私が英語で書いたものをChatGPTで訳して貼り付けたものです。多少の読みにくさはご了承ください。(翻訳に対して何も修正は入れていません。)
元はこちら

2023年5月9日までの間、GitHubにアップロードした画像や動画などのファイルは、世界中の誰でも閲覧できる公開状態でした。たとえリポジトリがプライベートであっても、例えば企業のアカウントでログインしたリポジトリでも同様です。これは、個人や企業の認証情報となる可能性があるため、問題が発生する可能性があります。この記事では、GitHub上のこれらのファイルへのアクセスを削除する方法を説明します。

2023年5月9日以降、システムが変更されたにもかかわらず、以前に添付されたファイルはまだ公開状態で存在しています。ログアウトしても、画像や動画などのファイルは閲覧可能です。では、GitHubからすべてのファイルを削除するためにはどうすればよいでしょうか?

  1. GitHubのAPIを使用して、(企業の)リポジトリ上のすべての添付ファイルのURLをスクレイピングするスクリプトを作成します。
  2. そして、そのURLリストをGitHub社に送信します。

GitHubのAPIを使用して、(企業の)リポジトリ上のすべての添付ファイルのURLをスクレイピングするスクリプトを作成します。

削除する必要のあるファイルは、プルリクエストやイシューのコメントとしてアップロードされているものです。GitHubの開発者が呼び出すことができるさまざまなAPIがありますが、ここではイシューイシューのコメントのみを使用します。プルAPIを使用しない理由は、イシューにはプルリクエストが含まれているためです。興味がある場合は、こちらを参照してください。これらのAPIを使用して、すべてのURLリンクを取得します。これはシェルなどで実行できます。

#!/bin/bash
DATE=`date +%Y%m%d-%T%S`

owner="owner_name"

# Get a repository list in your Organization then loop them.
gh api --paginate "/orgs/$owner/repos" -q '.[].name' | while read -r repo
do
    echo repository-name: $repo >> $DATE-github-png-mov-links.json

    # Extract data containing files' url from Issues and Pull Requests.
    # Get a Issues and Pull Requests list then export the line having "body" param.
    gh api --paginate --header 'Accept: application/vnd.github+json' --method GET /repos/$owner/$repo/issues -F filter=repos -F state=all -q ".[] | {body}" >> $DATE-github-png-mov-links.json

    # Extract data containing files' url from Issues comments and Pull Requests comments.
    gh api --paginate --header 'Accept: application/vnd.github+json' --method GET /repos/$owner/$repo/issues/comments -F filter=repos -F state=all -q ".[] | {body}" >> $DATE-github-png-mov-links.json
done

注意:データを制限なくスクレイピングするには、「-pagenate」オプションが必要です。このオプションにより、APIがすべてのデータを読み取ることができます。

URLリストをGitHub社にメッセージで送信してください。

JSONファイル(例:上記の例での$DATE-github-png-mov-links.json)の各行について、Rubyやシェル、JavaScriptなどの他の言語を使用してファイルのURLリンクを抽出してください。
以下はRubyの例です。

date = Time.now

re = Regexp.new('((https\:\/\/user-images.*?(\.mov|\.png)))')

# Replace a json file name.
File.open("2023xxxx-xx:xx:xxxx-png-mov-links.json", mode = "rt"){|f|
  f.each_line{|line|
    urls = line.scan(re)
    urls.each{|url|
      if url != nil
        # p url[0]
        File.open("#{date}.txt", mode = "a"){|f|
          f.write("#{url[0]}\n")
        }
      end
    }
  }
}

# There might be the same url several times due to the quote reply comments.
# It would be better to remove them for GitHub staff.
final_arr = []

File.open("#{date}.txt", mode = "rt"){|f|
  f.each_line{|line|
    final_arr.push(line)
  }
}

# Remove the boule links.
final_arr.uniq!

final_arr.each{|line|
  File.open("#{date}-result.txt", mode = "a"){|f|
    f.write("#{line}")
  }
}

最後に、あなたはGitHubにアカウント情報を添えてメッセージを送信します。
注意:ファイルのリンクは、そのファイルをアップロードした人によって報告される必要があります。

Discussion