Какова цель is_uploaded_file ()?

Документы говорят:

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