ASP.NET FileUpload Control - проблемы безопасности при буферизации на диск - PullRequest
3 голосов
/ 27 февраля 2009

В MSDN указано, что при загрузке файла с использованием элемента управления загрузки файлов ASP.NET (v.2.0) или базового файла HttpPostedFile, "загружаются в формате MIME multipart / form-data. По умолчанию все запросы , включая поля формы и загруженные файлы, больше 256 КБ буферизуются на диск, а не хранятся в памяти сервера. " MSDN Link

Кто-нибудь знает, где на диске он буферизован и когда этот буфер очищается / удаляется, то есть, когда запрос заканчивается, и что происходит в случае ошибки или неожиданного сценария, когда запрос не завершается изящно?

Меня беспокоит то, что если приложение может загружать конфиденциальную информацию (данные CC, личные данные и т. Д.), Этот файл будет помещен в буфер на диске и, возможно, не будет удален в конце запроса. Может ли это быть проблемой на общем хосте, то есть можно ли получить доступ к этому буферу извне приложения?

Может быть, я что-то не так понял, но любой совет / понимание / помощь будет высоко ценится, спасибо.

Ответы [ 2 ]

7 голосов
/ 27 февраля 2009

Ладно, удалось найти ответы на поставленные выше вопросы, так что я просто добавлю их сюда на случай, если это поможет кому-то еще.

По умолчанию (в файле machine.config) настройки для загрузки файла / запроса в целом

4 МБ как максимальный размер для запроса и 256 байт, сохраненных в памяти, прежде чем запрос буферизуется на диск. Эти параметры можно переопределить в файле web.config в разделе httpRuntime.

<httpRuntime maxRequestLength="8192" requestLengthDiskThreshold="512" />

Приведенный выше пример разрешит размер запроса до 8 МБ и начнет буферизацию на диске после 512 байт. Файл буферизуется до

C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ Временные файлы ASP.NET \ [APP_NAME] \ [SOME_HEX_NAME_DIR] \ [SOME_HEX_NAME_DIR] \ uploads \

по этому пути будет создан файл с [уникальное_имя] _post.tmp, он существует на время запроса, но недоступен из-за блокировки запроса.

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

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

0 голосов
/ 15 сентября 2010

Еще немного информации, если это кому-нибудь поможет:

Из MSDN : "Свойство RequestLengthDiskThreshold указывает предел порога буферизации входного потока в количестве байтов. Его значение не должно превышать значение свойства MaxRequestLength. После того как объект запроса превысит этот порог, он буферизуется прозрачно на диск. "

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

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

например.

<httpRuntime maxRequestLength="256" requestLengthDiskThreshold="262144"></httpRuntime>
...