Не использует функцию basename с $ _FILES Redundant?

Согласно разделу загрузки POST-метода в руководстве PHP , $_FILES['userfile']['name'] является исходным именем файла на клиентской машине. Пример # 2 в этом разделе использует функцию basename с $_FILES['userfile']['name'] следующим образом:

 $uploaddir = '/var/www/uploads/'; $uploadfile = $uploaddir . basename($_FILES['userfile']['name']); 

Я провел несколько экспериментов на своем локальном хосте ( Apache 2.2.14, PHP 5.3.1, Windows XP ) и выяснил, что следующие две строки эквивалентны:

 $_FILES['userFile']['name']; // "file.txt" basename($_FILES['userFile']['name']); // "file.txt" 

То есть, использование функции basename с $_FILES['userFile']['name'] кажется довольно избыточным. Не так ли?

Solutions Collecting From Web of "Не использует функцию basename с $ _FILES Redundant?"

То есть, использование функции basename с $ _FILES ['userFile'] ['name'] кажется довольно избыточным. Не так ли?

Нет, прежде всего по соображениям безопасности, как @Gumbo описывает в своем ответе; во-вторых, поскольку более старые версии IE используются для доставки полного пути файла на стороне клиента, например

 C:\Documents and Settings\Username\Desktop\Image_cropped.jpg 

это поведение остановилось совсем недавно, как IE8. Из этой записи в блоге MSDN, обнаруженной через этот вопрос SO :

Управление загрузкой файлов

Кроме того, в поле «Включить локальный каталог при загрузке файлов» URLAction установлено значение «Отключить» для зоны Интернета. Это изменение предотвращает утечку потенциально чувствительной локальной файловой системы в Интернет. Например, вместо отправки полного пути C: \ users \ ericlaw \ documents \ secret \ image.png, Internet Explorer 8 теперь будет отправлять только имя файла image.png.

HTTP-запросы могут быть подделаны, и поэтому имя файла, предоставленное в заголовке, также можно манипулировать.

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

используя basename () на полном пути, например /path/mydir/file.txt , возвращает file.txt . Это полезно, когда у вас есть полный путь к синтаксическому анализу, и вы просто хотите получить последнюю часть пути.