Ответ 1
Ну, вы можете передать любую строку в is_uploaded_file
.
Конечно, если вы передадите ему что-то прямо из $_FILES
, то да, конечно, он всегда будет возвращать true
, но если вы сами сформируете аргумент, то это может не быть.
Документы говорят:
Возвращает TRUE, если файл с именем filename был загружен через HTTP POST
Как $_FILES['blah']['tmp_name']
возможно, не быть результатом загрузки POST? PHP создал это имя файла.
Это полезно для обеспечения того, чтобы злоумышленник не пытался обманите script для работы с файлами, на которых это не должно быть работа - например, /etc/passwd.
Я понимаю, что я должен тщательно проверить содержимое и размер файла. Но как может злоумышленник контролировать все temp filename загруженного файла?
Или выполняет is_uploaded_file()
некоторые другие проверки?
Спасибо, что пролил свет.
Ну, вы можете передать любую строку в is_uploaded_file
.
Конечно, если вы передадите ему что-то прямо из $_FILES
, то да, конечно, он всегда будет возвращать true
, но если вы сами сформируете аргумент, то это может не быть.
В текущей форме 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
нет такой гарантии (опять же, хотя я считаю ее регрессией, если текущее статус-кво изменяется "в худшую сторону" ).