Как ограничить размер загружаемого файла в Wicket

Как ограничить размер файла при загрузке в Apache Wicket версии 1.4?

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

Если загружен слишком большой файл, браузер загрузит файл целиком, а Wicket создаст сообщение об ошибке проверки с ключом [form-id].uploadTooLarge.

Но как Wicket внутренне справляется с этой ситуацией, создавая временные файлы и т. Д.?

Я хотел бы предотвратить случай, когда пользователь загружает файл размером в несколько ГБ, который не умещается в памяти или на диске, пока Wicket обрабатывает запрос.


person Juha Syrjälä    schedule 19.11.2009    source источник


Ответы (3)


Я немного покопался в калитке репозиторий и обнаружил, что файл фактически записан на диск FileUploadBase.parseRequest (RequestContext ctx). Этот класс проверяет размер файла перед его записью на диск.

Проверка размера файла в конечном итоге использует javax.servlet.ServletRequest.getContentLength () для определения размера файла, что означает, что фактическая реализация зависит от того, какой контейнер сервлета вы используете; но я бы сказал, что можно с уверенностью предположить, что любой, кто написал реализацию сервлета, знал достаточно, чтобы получить размер файла из заголовка, вместо того, чтобы записывать все это на диск, а затем проверять его размер. Таким образом, вам не нужно беспокоиться о людях, пытающихся загрузить огромные файлы, занимая все ваше дисковое пространство.

person perilandmishap    schedule 04.12.2009
comment
Предположим, кто-то подделывает заголовок Content-Length как небольшое значение и загружает файл гораздо большего размера в том же запросе? - person Juha Syrjälä; 04.12.2009
comment
Я не вижу в коде ничего, что могло бы предотвратить это, но вряд ли это авторитетно. Кроме того, похоже, что реализация немного изменилась между 1.3.5 и 1.4. Я полагаю, что нужно написать доказательство концепции предполагаемого эксплойта и посмотреть, работает ли он. Вы также можете открыть список рассылки пользователей (wicket.apache.org/community.html# Community-Mailinglists) - разработчики следят за этим, и по моему опыту очень отзывчивы. - person perilandmishap; 07.12.2009

В документации по форме сказано:

В случае ошибки загрузки доступны два ключа ресурсов для указания сообщений об ошибках: uploadTooLarge и uploadFailed, т.е. на [page] .properties [form-id] .uploadTooLarge = Вы загрузили файл, размер которого превышает допустимый лимит в 2 МБ

Я предполагаю, что их увольняют при проверке отправки формы ... Вы пытались проверить, так ли это?

person Tim    schedule 30.11.2009

person    schedule
comment
Это установит максимальный размер для отправки формы, включая заголовки, другие поля и т. Д. Если вы хотите разрешить файлы размером до N байтов, вам необходимо установить для параметра MaxSize () значение немного больше, чем максимальный размер файла, и проверить фактический размер файла после скачать. - person Juha Syrjälä; 01.03.2011