Документы говорят:
Возвращает 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 (опять же, хотя я считаю это регрессией, если текущее статус-кво изменяется «к худшему»).