Документы говорят:
Возвращает TRUE, если файл с именем filename был загружен через HTTP POST
Как может $_FILES['blah']['tmp_name']
возможно, не быть результатом загрузки POST? PHP создал это имя файла.
Это полезно для обеспечения того, чтобы злоумышленник не пытался обмануть скрипт в работе над файлами, на которых он не должен работать – например, / etc / passwd.
Я понимаю, что я должен тщательно проверить содержимое и размер файла. Но как может злоумышленник контролировать все временное имя файла загруженного файла?
Или is_uploaded_file()
выполняет некоторые другие проверки?
Спасибо, что пролил свет.
Ну, вы можете передать любую строку в is_uploaded_file
.
Конечно, если вы передадите ему что-то прямо из $_FILES
тогда да, конечно, он всегда вернет true
, но если вы сформируете аргумент самостоятельно, это может не так.
В текущей форме is_uploaded_file
проверяет, что загрузки файлов включены (в противном случае это не может быть загруженный файл), и что предоставленное имя файла фактически было создано PHP (я знаю это, глядя на источник).
Это не очень полезно, поскольку, если во время загрузки не было никаких проблем,
is_uploaded_file($_FILES['blah']['tmp_name'])
всегда будет возвращать true
.
Однако $_FILES
, что $_FILES
«доступно» только с PHP 4.1.0, а is_uploaded_file
появился сначала с PHP 4.0.3. Вывод, который кажется логичным здесь, заключается в том, что было трудно загружать загруженную обработку файлов, надежно работая до того, $_FILES
был $_FILES
файл $_FILES
. Если ничего больше, не-суперглобалы могут быть введены и очень легко с включенными register_globals
которые раньше были еще одной проблемой с безопасностью PHP.
Если сегодня писать код и использовать $_FILES
как это предполагается, тогда я бы сказал, что is_uploaded_file
в его текущей реализации «бесполезен», потому что нет никакого вектора атаки, который может обмануть вас в обработке «плохого» файла.
Тем не менее, есть и другой способ взглянуть на вещи: is_uploaded_file
гарантированно работает корректно сейчас и в будущем, пока он доступен, независимо от того, что механики загрузки файлов и их использования для программиста. Возможно, сейчас это не дает ничего конкретного, но это абстракция над концепцией «безопасной загрузки файлов», которая поставляется с гарантией. Я думаю, что нет никакой гарантии для $_FILES
(опять же, хотя я считаю это регрессией, если текущее статус-кво изменяется «к худшему»).