Подтвердить что ты не робот

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

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

Возвращает TRUE, если файл с именем filename был загружен через HTTP POST

Как $_FILES['blah']['tmp_name'] возможно, не быть результатом загрузки POST? PHP создал это имя файла.

Это полезно для обеспечения того, чтобы злоумышленник не пытался обманите script для работы с файлами, на которых это не должно быть работа - например, /etc/passwd.

Я понимаю, что я должен тщательно проверить содержимое и размер файла. Но как может злоумышленник контролировать все temp filename загруженного файла?

Или выполняет is_uploaded_file() некоторые другие проверки?

Спасибо, что пролил свет.

4b9b3361

Ответ 1

Ну, вы можете передать любую строку в is_uploaded_file.

Конечно, если вы передадите ему что-то прямо из $_FILES, то да, конечно, он всегда будет возвращать true, но если вы сами сформируете аргумент, то это может не быть.

Ответ 2

В текущей форме is_uploaded_file проверяет, что загрузки файлов включены (в противном случае это не может быть загруженный файл) и что предоставленное имя файла фактически было создано PHP (я знаю это, глядя на источник).

Это не очень полезно, так как если во время загрузки не было проблем,

is_uploaded_file($_FILES['blah']['tmp_name'])

всегда будет возвращать true.

Однако учтите, что $_FILES имеет "только", доступный с PHP 4.1.0, а is_uploaded_file появился сначала с PHP 4.0.3. Вывод, который кажется логичным здесь, заключается в том, что было трудно загружать загруженную обработку файлов, безопасно работая до того, как была добавлена ​​суперкласма $_FILES. Если ничего больше, не-суперглобалы могут быть введены и очень легко с включенным register_globals - который раньше был еще одной больной точкой с безопасностью PHP.

Если сегодня писать код и использовать $_FILES, как это предполагается, то я бы сказал, что is_uploaded_file в его текущей реализации "бесполезен", потому что нет никакого вектора атаки, который может обмануть вас в обработке "плохого" ".

Однако есть и другой способ взглянуть на вещи: is_uploaded_file гарантированно работает правильно сейчас и в будущем, до тех пор, пока он доступен, независимо от того, что механика загрузки файлов и предоставления их доступным для программиста находятся. Возможно, сейчас это не дает ничего конкретного, но это абстракция над концепцией "безопасной загрузки файлов", которая поставляется с гарантией. Я бы подумал, что для $_FILES нет такой гарантии (опять же, хотя я считаю ее регрессией, если текущее статус-кво изменяется "в худшую сторону" ).