第8章 リクエスト情報 / 第1回 模擬試験
PHPのファイルアップロードに関する次の記述のうち、正しいものはどれか。
アップロードされたファイルは、`$_FILES`スーパーグローバル変数でアクセスできる。
`move_uploaded_file()`関数は、アップロードされたファイルを安全に移動するために使用される。
アップロードされたファイルのサイズは、`$_FILES['userfile']['size']`で取得できる。
上記すべて
正解
解説
3つの記述はすべて正しいです。
・アップロードされたファイルの情報は`$_FILES`スーパーグローバル変数に格納されます。`$_FILES['userfile']['tmp_name']`で一時ファイルパス、`$_FILES['userfile']['name']`で元のファイル名を取得できます。
・`move_uploaded_file()`は、HTTP POSTアップロードによってアップロードされたファイルであることを検証したうえで一時ファイルを指定先に移動します。`rename()`と違いこの検証があるため、アップロード処理では必ずこちらを使うべきです。
・`$_FILES['userfile']['size']`でアップロードされたファイルのバイト数を取得できます。
例:
```
if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
move_uploaded_file($_FILES['userfile']['tmp_name'], '/uploads/' . uniqid());
}
```
実務では、`$_FILES['userfile']['name']`(元のファイル名)をそのまま保存先パスに使うとパストラバーサルの原因になるため、`uniqid()`などでランダムなファイル名を生成し、拡張子もMIMEタイプの実体チェックで検証するのが安全です。
(参照: 独習PHP 第4版 第8章 リクエスト情報 8.8節 アップロード処理の実装 ― $_FILES p.396〜403)