在db中将文件存储为字节数组,存在安全隐患吗?

时间:2009-11-11 20:15:22

标签: asp.net database security virus

我们有一个asp.net应用程序,允许用户上传文件,文件保存到临时磁盘位置,然后附加到记录并保存在数据库中。

我的问题涉及安全和/或病毒问题。这种方法有安全漏洞吗?病毒如果永远不会被执行会造成伤害(文件被保存,然后使用文件流打开,转换为字节数组并保存到数据库。

稍后,当需要该文件时,我们将文件流回用户。

文件将保存到Web服务器上的文件夹中,如下所示:

context.Request.Files[0].SaveAs();(位置是app_data / files下的文件夹)

稍后当同一个用户创建记录时,我们从磁盘中获取文件并将其存储在db中,如下所示:

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 个答案:

答案 0 :(得分:3)

接受来自未知用户的文件时,始终存在安全风险。任何人都可能在Office文档中的VBA(Visual Basic for Applications)中编写病毒。

您的方法与直接在文件系统上保存或直接在数据库 中保存它们的方法相比具有安全风险,除了一个问题......

如果文件保存到磁盘,传统的病毒扫描程序可以扫描它们。据我所知,大多数病毒扫描程序不会将存储在数据库中的文件作为字节数组进行扫描。

如果是我的服务器,出于性能原因,我会将它们存储在文件系统上,而不是出于安全原因,你可以打赌,如果我允许有潜在危险的文件,例如办公室,我会让它们被病毒扫描程序扫描文件,可执行文件等

答案 1 :(得分:1)

让用户在允许他们上传文件之前创建登录。这种未经检查的访问是闻所未闻的......并不是说这本身就是一种解决方案,但就像所有良好的安全系统一样,它可以形成一个额外的层: - )

答案 2 :(得分:1)

我看不出存在比将文件保存到磁盘更多的安全风险。这里的风险通常与您存储数据的位置无关,因为您已经指出存储的文件没有被执行。

风险通常在于如何传输数据。蠕虫将利用这样的情况,这些情况允许将通过系统的数据仅仅视为代码并开始执行。这些漏洞利用并不要求存在任何“文件”转移感,过去特殊格式的URL就足够了。

那就是说,我从未理解在SQL数据库中存储大型二进制数据的愿望。为什么不直接将文件保存在磁盘上并将文件路径存储在数据库中。然后,您可以使用诸如WriteFile或URL重写之类的功能来使IIS尽其所能。