(PHP 3 >= 3.0.17, PHP 4 >= 4.0.3, PHP 5)
is_uploaded_file -- Определяет, был ли файл загружен при помощи HTTP POST
Описание
bool
is_uploaded_file ( string filename )
Возвращает TRUE, если файл filename был
загружен при помощи HTTP POST. Это полезно, чтобы убедиться в том,
что злонамеренный пользователь не пытается обмануть скрипт так, чтобы
он работал с файлами, с которыми работать не должен -- к примеру,
/etc/passwd.
Такие проверки особенно полезны, если существует вероятность того,
что операции над файлом могут показать его содержимое пользователю
или даже другим пользователям той же системы.
Для правильной работы, функции is_uploaded_file()
нужен аргумент вида $_FILES['userfile']['tmp_name'], - имя закачиваемого
файла на клиентской машине $_FILES['userfile']['name'] не подходит.
Пример 1. Пример использования функции is_uploaded_file()
<?php
if (is_uploaded_file($_FILES['userfile']['tmp_name'])) { echo "File ". $_FILES['userfile']['name'] ." uploaded successfully.\n"; echo "Displaying contents\n"; readfile($_FILES['userfile']['tmp_name']); } else { echo "Possible file upload attack: "; echo "filename '". $_FILES['userfile']['tmp_name'] . "'."; }
?>
|
|
Функция is_uploaded_file() доступна только начиная
с версии PHP 3.0.16 и PHP 4.0.2 для третьей и четвёртой линеек
соответственно. Если вам необходимо использовать более ранние версии,
вы можете использовать такую функцию, чтобы обезопасить себя:
Замечание:
Следующий пример не работает
в версиях PHP выше 4.0.2. Он полагается на внутреннюю
функциональность PHP, которая изменилась после этой версии.
Пример 2. Пример использования функции is_uploaded_file()
<?php /* Самодельная проверка на то, является ли файл загруженным. */ function is_uploaded_file($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($HTTP_POST_FILES['userfile'])) { copy($HTTP_POST_FILES['userfile'], "/place/to/put/uploaded/file"); } else { echo "Возможна атака загрузки файла: имя файла - '$HTTP_POST_FILES[userfile]'."; } ?>
|
|
См. также описание функции move_uploaded_file() и раздел
Загрузка файлов на сервер
для получения простых примеров использования.