Разве использование функции basename с $ _FILES ['userFile'] ['name'] не является избыточным? - PullRequest
4 голосов
/ 27 февраля 2010

Согласно метод 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'] представляется излишним. Не так ли?

Ответы [ 3 ]

9 голосов
/ 27 февраля 2010

То есть использование функции 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.

5 голосов
/ 27 февраля 2010

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

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

0 голосов
/ 27 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...