目次
1. 本記事のポイント
- PHPによる基本的なファイルアップロード処理の流れを理解できる
- ファイルの種類や保存先などに関する実装上の注意点がわかる
- 安全なアップロード処理のための対策を網羅的に確認できる
2. PHPのファイルアップロード処理とは?
PHPのファイルアップロード機能は、HTMLフォームを通じてユーザーからファイルを受け取り、サーバーに保存する仕組みを提供します。$_FILES
スーパーグローバル変数を用いて、アップロードされたファイルの情報(名前・種類・サイズ・一時保存パスなど)にアクセスできます。
実務では、プロフィール画像やドキュメント提出など多様な場面で用いられますが、悪意あるファイルのアップロードを通じてサーバーが攻撃されるリスクもあるため、安全対策が不可欠です。
また、PHPのfile_uploads
設定がOn
でないと処理が無効になる点にも注意が必要です。アップロード先のディレクトリのパーミッション設定や、ファイルサイズ制限(upload_max_filesize
やpost_max_size
)の設定も重要です。
3. 詳細解説
基本的なファイルアップロードの処理
以下は、画像ファイルをアップロードして保存するシンプルな処理例です。
PHP
// ファイルが送信されているか確認
if (isset($_FILES['userfile']) && $_FILES['userfile']['error'] === UPLOAD_ERR_OK) {
// アップロードされたファイルの一時パス
$tmpPath = $_FILES['userfile']['tmp_name'];
$name = basename($_FILES['userfile']['name']);
$uploadDir = __DIR__ . '/uploads/';
// 保存先のパス
$savePath = $uploadDir . $name;
// ファイルを移動
move_uploaded_file($tmpPath, $savePath);
echo "ファイルを保存しました: $savePath";
} else {
echo "アップロードエラー: " . $_FILES['userfile']['error'];
}
※ /uploads/
ディレクトリの書き込み権限(例:chmod 755
)が必要です。
ファイルの種類とサイズの検証を追加
ファイルの種類やサイズをチェックしないと、予期せぬファイルが保存される可能性があります。
PHP
// MIMEタイプチェックとサイズ制限
$allowedTypes = ['image/jpeg', 'image/png'];
$maxSize = 2 * 1024 * 1024; // 2MB
$type = mime_content_type($tmpPath);
$size = filesize($tmpPath);
if (!in_array($type, $allowedTypes)) {
die("許可されていないファイルタイプです");
}
if ($size > $maxSize) {
die("ファイルサイズが大きすぎます");
}
ファイル名の衝突・パス操作の対策
ユーザーが任意のファイル名を指定できるため、パスの操作やファイル名の衝突にも注意が必要です。
PHP
// 拡張子を除いたランダムなファイル名を生成
$ext = pathinfo($name, PATHINFO_EXTENSION);
$uniqueName = uniqid('upload_', true) . "." . $ext;
$savePath = $uploadDir . $uniqueName;
4. よくあるミス・誤解・落とし穴
move_uploaded_file()
を使わずcopy()
やrename()
を使うと、アップロード検証が適用されず安全性が低下します。- フォーム側に
enctype="multipart/form-data"
を指定していないと、ファイルが送信されません。 $_FILES['userfile']['error']
のチェックを怠ると、アップロード失敗を見逃す可能性があります。$_FILES
にファイルが存在しても、サイズ制限超過やPHP設定エラーで保存に失敗することがあります。
5. まとめ
PHPのファイルアップロード処理は、正しい構文とバリデーション、安全対策を組み合わせることで安定運用が可能です。
実務では、ファイルの種類・サイズ・保存パス・ファイル名の管理に加え、攻撃防止のための厳格な検証処理が必要です。
PHP設定値やディレクトリ権限といった前提条件の把握も忘れず、開発環境と本番環境で挙動が変わらないように注意しましょう。