Согласно разделу загрузки 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']
кажется довольно избыточным. Не так ли?
То есть, использование функции 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
. Это полезно, когда у вас есть полный путь к синтаксическому анализу, и вы просто хотите получить последнюю часть пути.