1

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

我的问题与安全和/或病毒问题有关。这种方法是否存在任何安全漏洞?如果从不执行病毒是否会造成危害(文件被保存,然后使用文件流打开,转换为字节数组并保存到 DB。

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

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

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);
4

3 回答 3

4

接受来自未知用户的文件时总是存在安全风险。任何人都可能在办公室文档中使用 VBA(Visual Basic for Applications)编写病毒。

除了一个问题之外,您的方法与将它们直接保存在文件系统或直接保存在数据库中没有或多或少的安全风险......

如果将文件保存到磁盘,则可以通过传统的病毒扫描程序对其进行扫描。据我所知,大多数病毒扫描程序不会扫描以字节数组形式存储在数据库中的文件。

如果是我的服务器,我会出于性能原因而不是安全原因将它们存储在文件系统上, ETC。

于 2009-11-11T20:24:28.030 回答
1

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

于 2009-11-11T20:26:59.820 回答
1

我看不出除了将文件保存到磁盘之外还有安全风险。这里的风险通常与存储数据的位置无关,因为正如您已经指出的那样,存储的文件不会被执行。

风险通常在于数据的传输方式。蠕虫将利用允许将通过系统的数据视为代码并开始执行的情况。此类漏洞不需要存在任何正在传输的“文件”的感觉,在过去,一个特殊格式的 URL 就足够了。

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

于 2009-11-11T20:28:24.527 回答