Функция PHP is_uploaded_file

bool is_uploaded_file ( string filename )

Возвращает TRUE, если файл filename был загружен при помощи HTTP POST. Это полезно, чтобы убедиться в том, что злонамеренный пользователь не пытается обмануть скрипт так, чтобы он работал с файлами, с которыми работать не должен -- к примеру, /etc/passwd.

Такие проверки особенно полезны, если существует вероятность того, что операции над файлом могут показать его содержимое пользователю или даже другим пользователям той же системы.

Для правильной работы, функции is_uploaded_file() нужен аргумент вида $_FILES['userfile']['tmp_name'], - имя закачиваемого файла на клиентской машине $_FILES['userfile']['name'] не подходит.

Пример использования функции is_uploaded_file()

<?php
  
   if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
      echo "File ". $_FILES['userfile']['name'] ." uploaded successfully. ";
      echo "Displaying contents ";
      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().