Asp.net 将文件存储为数据库中的字节数组,是否存在安全风险?

Asp.net 将文件存储为数据库中的字节数组,是否存在安全风险?,asp.net,database,security,virus,Asp.net,Database,Security,Virus,我们有一个asp.net应用程序,允许用户上传文件,文件保存到临时磁盘位置,然后附加到记录并保存在数据库中 我的问题涉及安全和/或病毒问题。这种方法是否存在安全漏洞?如果病毒从未执行过,它是否会造成伤害(文件保存,然后使用filestream打开,转换为字节数组并保存到DB) 稍后,当需要该文件时,我们将该文件流回给用户 这些文件保存到web服务器上的文件夹中,如下所示: FileStream fileStream = File.OpenRead(currentFilePath); byte[]

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

我的问题涉及安全和/或病毒问题。这种方法是否存在安全漏洞?如果病毒从未执行过,它是否会造成伤害(文件保存,然后使用filestream打开,转换为字节数组并保存到DB)

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

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

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)
//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);
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)
//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);
我们限制可以上载到此列表的文件:

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

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

与直接将它们保存在文件系统或数据库中相比,您的方法不会带来更多或更少的安全风险,除了一个问题…

如果文件被保存到磁盘上,它们可以被传统的病毒扫描器扫描。据我所知,大多数病毒扫描器不会扫描以字节数组形式存储在数据库中的文件


如果它是我的服务器,出于性能原因而不是安全原因,我会将它们存储在文件系统中。你可以打赌,如果我允许使用具有潜在危险的文件,例如office文档、可执行文件等,我会让病毒扫描程序对它们进行扫描。

接受来自未知用户的文件时总是存在安全风险您可能会在office文档中使用VBA(Visual Basic for Applications)编写病毒

与直接将它们保存在文件系统或数据库中相比,您的方法不会带来更多或更少的安全风险,除了一个问题…

如果文件被保存到磁盘上,它们可以被传统的病毒扫描器扫描。据我所知,大多数病毒扫描器不会扫描以字节数组形式存储在数据库中的文件


如果它是我的服务器,出于性能原因而不是安全原因,我会将它们存储在文件系统中。你可以打赌,如果我允许使用具有潜在危险的文件,例如office文档、可执行文件等,我会让病毒扫描程序对它们进行扫描。

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

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

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

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


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

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

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


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

正是如此。关于在数据库中存储文件的争论在本网站的许多帖子中都得到了非常响亮的回答:“不要这样做”。关于在数据库中存储文件的争论在本网站的许多帖子中都得到了响亮的回答:“不要这样做”。+1回敬你,因为你提醒了我应该实现的东西!:-)+我回敬你,因为你让我想起了我应该实施的事情!:-)根据下面的评论,让我们撇开“文件系统”和“数据库”的争论,我对安全问题感兴趣。我的理解是,保存一个文件,然后使用streamreader将其转换为字节数组是完全安全的,也就是说,该文件可能会受到任何类型的病毒、特洛伊木马的攻击,因为该文件从未执行过,所以我们只是在字节流中移动,因此服务器不会受到任何攻击。。。我的问题涉及该领域的任何专家,他们可以告诉我我错了。根据下面的评论,让我们撇开“文件系统”与DB的争论,我对安全问题感兴趣。我的理解是,保存一个文件,然后使用streamreader将其转换为字节数组是完全安全的,也就是说,该文件可能会受到任何类型的病毒、特洛伊木马的攻击,因为该文件从未执行过,所以我们只是在一个stre中移动