безопасность — Можете ли вы доверять размеру файла, заданному массивом $ _FILES в PHP?

Извините, если это тривиально или очевидно, но я не смог найти ответ, погуглив его.

Откуда size значение в $_FILES['name'] массив пришел? Не могли бы вы доверять ценности этого ($_FILES['name']['size']) или вы все еще должны проверить это с помощью filesize() функционировать?

Другими словами, нужно ли проверять фактический размер файла с помощью filesize функция, чтобы заметить, если он правильно загружен?

15

Решение

Если файл загружен правильно и все в порядке, вы Можно использовать информацию, предоставленную PHP superglobal $_FILES, С помощью filesize() добавляет небольшие накладные расходы, поскольку ОС должна проверять размер файла. Это зависит от вас, но проверка исходного кода PHP на то, как он все это делает, ясно показывает, что он правильно вычисляет размер файла в многокомпонентном HTTP-запросе. По сути, вы бы снова делали ту же работу, если бы filesize() файл.

Причиной того, что вы можете доверять этому непосредственно из суперглобальной переменной, является тот факт, что многочастные запросы предоставляют границу, между которой находятся данные. По определению невозможно получить поврежденные данные, если протокол для извлечения данных не соблюдается. Другими словами, это означает, что браузер отправляет «разделитель», а PHP просто находит его и начинает проверять текст на наличие данных между этим разделителем. Для этого он точно выделяет требуемую память и может немедленно кэшировать выделенное число — и это число является размером файла. Если по пути что-то не так, вы получите ошибки. Поэтому, если файл загружен правильно, информация о размере является достоверной.

11

Другие решения

PHP, похоже, пересчитывает размер файла после его загрузки. Хотя клиент отправляет заголовок с указанием content-length файла, основанного на тестах (с PHP 5.5), этот заголовок просто игнорируется, и вместо этого измеряется длина. Лично я бы всегда использовал filesize() чтобы получить размер файла, так как вы можете быть более уверены в том, какое измерение используется, но это в конечном итоге зависит от вас. В любом случае, $_FILES['file_name']['size'] представляется безопасным значением для использования.

9

Вы должны скорее проверить, если клиент сообщил $_FILES['file_name']['size'] равно значению, данному filesize(), Разница может указывать на ошибку во время передачи загруженного файла.

4
По вопросам рекламы [email protected]