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

MAX_FILE_SIZE в PHP - какой смысл?

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

Скрытое поле MAX_FILE_SIZE (измеренное в байтах) должно предшествовать поле ввода файла, а его значение - максимальный размер файла, принятый PHP. Этот элемент формы всегда должен использоваться, поскольку он избавляет пользователей от необходимости ждать передачи большого файла только для того, чтобы обнаружить, что он слишком велик, и передача не удалась. Имейте в виду: обмануть этот параметр на стороне браузера довольно просто, поэтому никогда не полагайтесь на файлы с большим размером, которые блокируются этой функцией. Это просто удобная функция для пользователей на клиентской стороне приложения. Однако настройки PHP (на стороне сервера) для максимального размера не могут быть обмануты.

ОК... Скажи что? Сначала он сообщает, что он должен предшествовать полю загрузки файла. Затем он говорит нам, что это просто для удобства. И к тому же - это на стороне клиента, так что любой может с ним пообщаться. После googling вокруг я также нашел информацию, что нет известных браузеров, которые ее поддерживают.

WTF? Почему он сказал, что должен предшествовать полю загрузки файла, если он кажется (по сути, совершенно бессмысленным)? Должен ли я вообще поместить его в свой HTML?

4b9b3361

Ответ 1

На данный момент нет браузеров, которые действительно заботятся о директиве MAX_FILE_SIZE, поэтому это довольно бессмысленно. Я полагаю, что это дает вам более подробный контроль над максимальными размерами при загрузке (как выше, чем выше), а не с php.ini, но лично я просто игнорирую его, и вы, вероятно, тоже должны это сделать. Это, конечно же, не остановит пользователя, загружающего больший, чем требуется, файл - руководство в этом отношении довольно вводит в заблуждение.

Ответ 2

После неудачной попытки найти какую-либо авторитетную информацию о MAX_FILE_INFO я решил прибегнуть к решительным мерам - и заглянул в священный источник PHP.

Я проверил весь PHP-источник рекурсивно с помощью grep:

grep -ri MAX_FILE_SIZE .

Единственное место, где упоминалось эта переменная, было (исключая папку test) - файл rfc1867.c. Полностью ожидаемый, поскольку стандарт rfc1867 касается загрузки файлов.

Связанный код C:

......
if (!strcasecmp(param, "MAX_FILE_SIZE")) {                                                                                                                                                                              
   max_file_size = atol(value);
}
......
......
if (PG(upload_max_filesize) > 0 && (total_bytes+blen) > PG(upload_max_filesize)) {
    cancel_upload = UPLOAD_ERROR_A;
} else if (max_file_size && ((total_bytes+blen) > max_file_size)) {
    cancel_upload = UPLOAD_ERROR_B;
} else if
....

Итак - здесь короткое объяснение приведенного выше кода:

1) сначала мы получаем значение MAX_FILE_SIZE в переменную max_file_size.

2) Затем мы проверяем, существует ли значение max_file_size и если сумма уже принятых байтов (total_bytes) + размер байтов в буфере (blen) превышает max_file_size.

3) Если 2 истинно - в этот момент мы отменяем загрузку с некоторым кодом ошибки, который был задан этой константой: UPLOAD_ERROR_B

НО - как вы можете видеть - прямо перед проверкой переменной max_file_size - PHP выполняет ТОЧНО ОЧЕНЬ ПРОВЕРКУ для переменной upload_max_filesize!!! Итак - у нас это есть.

Вывод: IMHO-op прав - в ваших формах есть 0 баллов, включая MAX_FILE_SIZE! Просто установите upload_max_filesize в файл php.ini или динамически с помощью ini_set().

Ответ 3

Пока мы не найдем браузеры, которые его поддерживают, на стороне клиента нет точки.

Однако на стороне сервер MAX_FILE_SIZE выполняет, влияя на значения, полученные из $_FILES['your_file'].

Предполагая, что запрос браузера действительно прошел через post_max_size, обычно это то, что дает PHP:

array(5) {
    ["name"]=> string(11) "my_upload.dll"
    ["type"]=> string(24) "application/x-msdownload"
    ["tmp_name"]=> string(26) "C:\WINDOWS\Temp\php86A.tmp"
    ["error"]=> int(0) // UPLOAD_ERR_OK
    ["size"]=> int(238592)
}

Но если размер загруженного файла превышает MAX_FILE_SIZE, вы увидите:

array(5) {
    ["name"]=> string(11) "my_upload.dll"
    ["type"]=> string(0) ""
    ["tmp_name"]=> string(0) ""
    ["error"]=> int(2) // UPLOAD_ERR_FORM_SIZE
    ["size"]=> int(0)
} 

И часть "MAX_FILE_SIZE должна предшествовать поле ввода файла", это не шутка. Это на самом деле работает, потому что PHP будет интерпретировать загрузку браузера POST последовательно:

<input name=F1 type=file> 
<input name=F2 type=file>
F1 and F2 will not be affected by MAX_FILE_SIZE

<input name=MAX_FILE_SIZE value=1024 type=hidden>
<input name=F3 type=file>
<input name=F4 type=file>
F3 and F4 will have MAX_FILE_SIZE = 1024 bytes

<input name=MAX_FILE_SIZE value=0 type=hidden>
<input name=F5 type=file>
<input name=F6 type=file>
F5 and F6 will have MAX_FILE_SIZE = 0 (infinite)

<input name=MAX_FILE_SIZE value=1 type=hidden>
<input name=F7 type=file> 
<input name=F8 type=file>
F7 and F8 will have MAX_FILE_SIZE = 1 byte

Также обратите внимание, что PHP интерпретирует регистр MAX_FILE_SIZE незаметно, поэтому MAX_FILE_SIZE и MAX_FILE_SIZE тоже будут работать.

Ответ 4

Я считаю, что смысл в том, что совместимые браузеры будут препятствовать отправке формы в том случае, если пользователь выбрал слишком большой файл, что позволит им сохранить хотя бы частичную загрузку (которая может занять некоторое время) файл, который будет отклонен.

На стороне сервера PHP по-прежнему проверяет и применяет различные ограничения, установленные в PHP.ini, и будет ссылаться на то, что загрузка слишком велика в обычном режиме, то есть код ошибки, установленный в $_FILES. Вы можете подумать о поле как о аналогии с проверкой JavaScript - мы можем сделать быструю проверку на стороне клиента для удобства пользователя, но мы по-прежнему делаем правильный серверный тест и применяем его для всех запросов.

Как утверждали другие, не существует никаких браузеров, которые действительно пытаются выполнить эту проверку, делая ее относительно бесполезной.

Ответ 5

Далее следует, что я ошибаюсь, пожалуйста, прочитайте другие ответы, которые лучше информированы и точны (AFAIK).

Я думаю, что точка точно такая, как она заявляет:

Этот элемент формы всегда должен быть используется, поскольку это избавляет пользователей от проблем ожидая, что большой файл будет переданы только для того, чтобы найти, что это было слишком велико и передача не выполнена

Да, его можно обмануть, и поэтому не следует полагаться на то, чтобы предотвратить загрузку больших файлов, но для незванных пользователей, если загруженный файл больше целого в этом поле, PHP запрещает эту загрузку и представляет код ошибки в массиве $_FILES (источник - комментарии на php.net).

Ответ 6

Я использую его для установки ограничения размера файла, когда конкретному приложению нужны файлы меньшего размера, чем предел в php.ini. Мои скрипты php проверяют его, но он установлен в HTML-форме. Различные формы имеют разные размеры файлов. Я не уверен, что это имеет много общего с предполагаемым использованием, но это упрощает повторное использование моих сценариев. Было бы хорошо, если бы его можно было проверить на уровне браузера, но это не единственная причина, по которой это полезно.