PHP のファイルアップロードの脆弱性と対策|乗っ取りを防ぐ5つのこと
PHP のファイルアップロードは、乗っ取りの入り口になりやすい。置き場所・名前・形式の確かめ方など、防ぐための基本をまとめた。
ファイルのアップロードは、サイトの乗っ取りの入り口になりやすい。PHP のファイルを置かれて実行されると、PHP2Shell と同じように、サーバー上で好きなプログラムを動かされてしまう。
この記事の要点
- アップロードされたファイルは、Web から直接開けない場所に置く
- ファイル名は付け直す(送られてきた名前を使わない)
- 形式は拡張子ではなく、中身(
finfo)で確かめる - 置き場所では PHP を実行させない
- 大きさの上限を決める
防ぐための5つのこと
| すること | 理由 |
|---|---|
| Web から見えない場所に置く | 置かれたファイルを URL で開かれないため |
| 名前を付け直す | ../ などで別の場所に書かれるのを防ぐため |
| 中身で形式を確かめる | 拡張子だけ変えた PHP のファイルを弾くため |
| 置き場所で PHP を実行させない | 万一置かれても動かないようにするため |
| 大きさの上限を決める | サーバーを埋められないため |
PHP での書き方の要点
- 受け取ったファイルは
move_uploaded_file()で移す - 形式は
finfo_file()で MIME タイプを調べ、許す形式だけを通す - 名前は
bin2hex(random_bytes(16))などで作り、拡張子は許す形式から付ける upload_max_filesizeとpost_max_sizeで大きさの上限を決める
WordPress の uploads に PHP のファイルがあったら
wp-content/uploads は画像などの置き場で、PHP のファイルは普通は無い。あれば改ざんを疑う。
PHP2Shell とのつながり
PHP2Shell の応急処置の1つは session.upload_progress.enabled=0。アップロードの進み具合を扱う機能が、攻撃に使われるためだ。アップロードの機能は、PHP 本体の側でも狙われやすい。
よくある質問
拡張子で画像だけに絞れば、安全ですか?
安全ではありません。
拡張子は簡単に変えられます。finfo で中身を確かめ、名前も付け直してください。
アップロードの置き場所で PHP を止めるには?
Web サーバーの設定で、その場所では PHP を実行しないようにします。
そもそも Web から開けない場所に置くのがいちばん確実です。
参考にした情報
- php.net(2026年10月21日のセキュリティ告知)
- php.net:Supported Versions
- php.net:Unsupported Branches
- php.net:付録(移行ガイド)
- php.net:ファイルアップロードの処理
この記事の情報
2026年10月22日時点の公開情報にもとづく。最新は各公式のページを確認すること。
URL を入れるだけで、PHP2Shell の危険度と今やることが分かる。移行の相談もできる。
無料で診断する


