is_uploaded_file
(PHP 4 >= 4.0.3, PHP 5)
is_uploaded_file — HTTP POST でアップロードされたファイルかどうかを調べる
説明
filename という名前のファイルが HTTP POST によりアップロードされたものである場合に TRUE を返します。 悪意のあるユーザがスクリプトをだまして、 本来見られてはいけないはずのファイル (/etc/passwd など) にアクセスすることを防止したい場合に、この関数は有用です。
この種の確認は、アップロードされたファイルに関して何でもできる場合には、 その内容をユーザ、または同じシステム上の他のユーザにさえ 暴かれる可能性があるため、特に重要です。
適切に動作させるため、関数 is_uploaded_file() は $_FILES['userfile']['tmp_name'] のような引数を必要とします。 アップロードされたファイルのクライアントマシン上での名前 $_FILES['userfile']['name'] では動作しません。
パラメータ
- filename
-
調べたいファイル名。
返り値
成功した場合に TRUE を、失敗した場合に FALSE を返します。
例
Example#1 is_uploaded_file() の例
<?php
if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
echo "ファイル ". $_FILES['userfile']['name'] ." のアップロードに成功しました。\n";
echo "その中身を表示します\n";
readfile($_FILES['userfile']['tmp_name']);
} else {
echo "おそらく何らかの攻撃を受けました。";
echo "ファイル名 '". $_FILES['userfile']['tmp_name'] . "'.";
}
?>
Example#2 PHP 4 < 4.0.3 用の is_uploaded_file() の例
以下のサンプルは PHP 4.0.2 以降の PHP 4 では動きません。 これはこのバージョン以降で PHP の内部処理が変更されたためです。
<?php
/* アップロードされたファイルのテスト */
function is_uploaded_file_4_0_2($filename)
{
if (!$tmp_file = get_cfg_var('upload_tmp_dir')) {
$tmp_file = dirname(tempnam('', ''));
}
$tmp_file .= '/' . basename($filename);
/* ユーザは php.ini で最後にスラッシュを付けているかも知れない... */
return (ereg_replace('/+', '/', $tmp_file) == $filename);
}
/* 以下はこの関数の使用方法。これら古いバージョンには
* move_uploaded_file() もない。 */
if (is_uploaded_file_4_0_2($HTTP_POST_FILES['userfile'])) {
copy($HTTP_POST_FILES['userfile'], "/place/to/put/uploaded/file");
} else {
echo "ファイルアップロード攻撃を受けた可能性あり: ファイル名 '$HTTP_POST_FILES[userfile]'";
}
?>