セキュリティ
ファイルアップロード機能は危険な機能
2026年10月8日

レン
プロフィール画像をアップロードできるようにしたよ!

ウィルスン
…アップロード機能。ワタシが最も歓迎する機能だ。なにしろ、キミのサーバーにワタシのファイルを置かせてもらえるのだからな。それが実行できる場所に置かれ、実行できる形式であれば、その時点でサーバーはワタシのものだ。

レン
画像しか受け付けないつもりなんだけど…

プロクラ
そこが甘いところでね。「画像だけ」を正しく判定するのは、思ったより難しいんだ。
よくある不十分な判定
拡張子で判定するのは、名前を見ているだけです。中身が別のものでも、名前さえ揃えれば通ります。逆に、中身を見る方式でも、画像として正しく読める細工は可能です。判定を積み重ねるより、受け取ったものを実行できない場所に置き、名前も自分で付け直すほうが確実です。
- 拡張子だけで判断する(名前を変えるだけで通ってしまう)
- ブラウザが申告する種類を信じる(送信側が自由に指定できる値なので信用できない)
- ファイル名をそのまま保存先に使う(意図しない場所へ書き込まれる細工がある)
守りは「重ねる」のが基本
攻撃
ファイアウォール
不要な入口を塞ぐ
SSH鍵認証
総当たりを無効化
OS更新
既知の穴を埋める
サーバー
1つ破られても次の層で止まる。どれか1つでは不十分
実装するなら守ること
- ファイルの中身を検査して、本当にその形式か確認する
- ファイル名は自分で付け直す(利用者が付けた名前をそのまま使わない)
- 公開ディレクトリの外に保存し、必要なときだけプログラム経由で配信する
- 保存先でプログラムが実行されない設定にする
- サイズの上限を決める(大量アップロードでディスクを埋められるのを防ぐ)
- 画像は保存時に変換・再生成すると、埋め込まれた不正なデータを落とせる

レン
そこまでやるなら、いっそ外部のサービスに任せた方が楽?

プロクラ
それは十分に良い判断だよ。ファイル保存を専門のサービスに任せれば、自分のサーバーに置かない構成にできる。実行される心配がなくなるし、容量の管理も楽になる。「自分で持たない」のは立派なセキュリティ対策なんだ。
画像でも安心できない理由

プロクラ
中身を検査して本当に画像だと確認しても、まだ終わりではないんだ。画像として正しいまま、別の意味を持たせられる場合がある。
- 画像ファイルの中に、別の内容を紛れ込ませることができる
- 表示するときの扱い方によっては、それが実行されうる
- だから「置き場所で実行させない」ことが、判定と同じくらい重要になる
- 画像を作り直して保存すれば、余計な情報も落とせる
容量と枚数の制限

プロクラ
見落とされやすいのが、大きさと回数の制限だよ。上限が無いと、大きなファイルを繰り返し送られただけでディスクが埋まる。攻撃というより、事故のような形で止まるんだ。
- 1ファイルの大きさに上限を設ける
- 1人あたりの回数と合計容量に上限を設ける
- 処理中の一時ファイルを必ず消す
- ディスクの使用率を監視する

レン
判定するだけじゃなくて、置き場所と上限まで含めて設計するんだね。
受け取ったあとの扱い
- 保存先を公開ディレクトリの外にして、必要なときだけ配信する
- 配信するときは、実行ではなくダウンロードとして扱う
- 利用者が付けたファイル名をそのまま表示しない(表示時の無害化も必要)
- 不要になったファイルを消す仕組みを用意する
VPSの料金を比較する
あわせて読みたい
- セキュリティ使わなくなったVPSを放置するとどうなるか止めたつもりでも課金は続き、更新されないサーバーは他人に使われます。放置で起きることと、閉じるときにやるべきことを順に解説します。
- セキュリティセルフホストの落とし穴:更新を止めると何が起きるか自前で運用する以上、更新も自分の仕事です。溜めると上げられなくなる仕組み、更新の前にやること、そして続けられる頻度の決め方を解説します。
- セキュリティセルフホストのバックアップ:自分のデータは自分で守る既製のサービスがやってくれていたことを、自分で用意する必要があります。何を対象にするか、どこへ置くか、そして戻せるかの確認方法を解説します。
- セキュリティしつこいアクセスを止める:レートリミット回数制限をどこに掛けるべきか、厳しすぎて普通の利用者を弾かないための決め方、そしてこれが「防ぐ」ではなく「遅くする」対策である理由を解説します。