📘

【Go】画像の Exif 情報を削除する

2023/12/01に公開

はじめに

Qiita のトレンドに上がっていたあなたの作った画像アップローダー、投稿者の個人情報ダダ洩れだよ!を読みました。
とても勉強になったので、普段使っている Go で Exif 情報を削除する方法をまとめておこうと思います。

Exif 情報とは

Exif 情報とは、画像にテキスト情報を保持するための仕組みのことです。
Exif 情報のおかげで、撮影日時や撮影した場所の位置情報を画像とセットで保持することができます。

なぜ削除するのか

セキュリティ的によろしくないからです。
位置情報を保持したままの画像がアプリケーションにアップロードされてしまうと、撮影者の位置情報が筒抜けとなってしまい、個人情報の流出に繋がります。
SNS 系のアプリでは、特に気をつけたほうが良さそうです。

Go で Exif 情報を削除する

筆者が普段使っている Go で Exif 情報を削除する方法をまとめます。
調べたところ、外部パッケージの imaging が良さそうです。
imaging の良いポイントとして、画像の向きを保持しながら Exif 情報を削除することができます。
単純に Exif 情報を削除してしまうしてしまうと、画像の向きの情報も消えてしまうため、注意が必要です。

imaging のインストール

まずは imaging をインストールします。

go get -u github.com/disintegration/imaging@latest

Decode で削除する

今回は Decode を使用して Exif 情報を削除します。
以下のように直接パスを指定してファイルを開く場合は Open を使う実装の方がシンプルです。
ただ、今回はアプリケーション開発において汎用性が高い Decode を取り上げます。

package main

import (
	"os"

	"github.com/disintegration/imaging"
)

func main() {
	f, err := os.Open("./sample/before.jpeg")
	if err != nil {
		panic(err)
	}
	defer f.Close()

	// Exif 情報を削除する
	// AutoOrientation でデコード御に向きが自動で調整される
	img, err := imaging.Decode(f, imaging.AutoOrientation(true))
	if err != nil {
		panic(err)
	}

	// 画像を保存
	if err := imaging.Save(img, "./sample/after.jpeg"); err != nil {
		panic(err)
	}
}

ダウンロードした画像から Exif 情報が削除されているかを比較してみます。

変換前は Exif が存在するのに対して、変換後は Exif の情報が消えていますね。

さいごに

Go で画像の Exif 情報を削除する方法を紹介しました。
セキュリティ的に大事な部分ですので、画像をアップロードするすること機能を作る場合は Exif 情報の削除を検討してみてください。

参考

あなたの作った画像アップローダー、投稿者の個人情報ダダ洩れだよ!

Discussion