хранение файлов в виде байтового массива в дБ, угроза безопасности? - PullRequest
1 голос
/ 11 ноября 2009

У нас есть приложение asp.net, которое позволяет пользователям загружать файлы, файлы сохраняются во временную папку на диске, а затем присоединяются к записи и сохраняются в БД.

Мой вопрос касается вопросов безопасности и / или вирусов. Есть ли дыры в безопасности в этом подходе? Может ли вирус причинить вред, если он никогда не выполняется (файл сохраняется, затем открывается с использованием файлового потока, преобразуется в байтовый массив и сохраняется в БД.

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

Файлы сохраняются в папке на веб-сервере следующим образом:

context.Request.Files[0].SaveAs(); (папка находится в папке app_data / files)

позже, когда тот же пользователь создает запись, мы берем файл с диска и сохраняем его в БД следующим образом:

FileStream fileStream = File.OpenRead(currentFilePath);
byte[] ba = new byte[fileStream.Length];
int len = fileStream.Read(ba, 0, ba.Length);
//ba saved to DB here as varbinary(max)

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

List<string> supportedExtensions = new List<string>(10) {".txt", ".xls", ".xlsx", ".doc", ".docx", ".eps", ".jpg", ".jpeg", ".gif", ".png", ".bmp", ".rar", ".zip", ".rtf", ".csv", ".psd", ".pdf" };

Файл передается обратно в веб-браузер пользователя следующим образом:

//emA = entity object loaded from DB
context.Response.AppendHeader("Content-Disposition", "inline; filename=\"" + emA.FileName + "\"");

context.Response.AddHeader("Content-Type", emA.ContentType);
context.Response.BinaryWrite(emA.FileContent);

Ответы [ 3 ]

3 голосов
/ 11 ноября 2009

Всегда существует угроза безопасности при приеме файлов от неизвестных пользователей. Любой может написать вирус в VBA (Visual Basic для приложений) в офисных документах.

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

Если файлы сохранены на диске, их можно проверить с помощью традиционных антивирусных сканеров. Насколько я знаю, большинство антивирусных сканеров не сканируют файлы, которые хранятся в БД в виде байтового массива.

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

1 голос
/ 11 ноября 2009

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

Риск обычно заключается в том, как данные передаются. Черви будут использовать обстоятельства, позволяющие обрабатывать то, что было только данными, проходящими через систему, как если бы это был код, и начать выполнение. Такие эксплойты не требуют наличия какого-либо смысла передаваемого «файла», в прошлом может быть достаточно специально отформатированного URL.

Тем не менее, я никогда не понимал желание хранить большие двоичные данные в базе данных SQL. Почему бы просто не сохранить файлы на диске и сохранить путь к файлу в БД. Затем вы можете использовать такие функции, как WriteFile или перезапись URL, чтобы заставить IIS делать то, что хорошо.

1 голос
/ 11 ноября 2009

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

...