9

这是我第一次为处理用户上传的文件而构建 Web 应用程序,我对通常如何完成此操作有一些疑问:

  1. 是否有任何我必须考虑的安全问题?要处理的文件本质上是我的应用程序将逐行读取的文本文件。我应该限制文件上传扩展名和/或我应该考虑其他任何预防措施吗?

  2. 上传文件的最佳组织方法是什么?这些文件不需要永久存储在我的应用程序中,所以我应该将它们转储到一般的“数据”文件夹中并删除不再需要的任何内容吗?

  3. 构建具有我错过的类似功能的 Web 应用程序是否还有其他重要方面?

谢谢

4

2 回答 2

6
  1. 您必须注意的唯一安全问题是将原始文本(没有数据清理以防止 SQL 注入)插入数据库。如果不涉及数据库,则应该没问题。至于扩展,限制扩展确实是一个糟糕的顶级过滤器。拥有它很好,但它只是深入了解文件真正包含的内容。文件大小限制也会有所帮助。

  2. 大量事务保存到磁盘的成本可能很高,但另一方面,随着使用更多请求/更多线程,它会减少服务器内存的混乱。您也可以使用内存中的文件,但对于大文件,它最终可能是有害的。考虑您正在使用的内容并选择最佳方法。

  3. 定义一个超时时间,这样上传的大文件就不会占用不必要的服务器进程,但最终还是太大了。

我假设您正在使用 ASP.NET 的FileUpload控件。请记住,文件不会通过回发保留(以防止安全漏洞),因此用户必须在每次请求页面时继续浏览文件。如果您有服务器端验证器,这会很麻烦。


编辑回答评论:

通过在内存中工作,我说的是纯粹通过代码操作上传的文件,而不是将其物理保存在服务器的磁盘上。

例如,如果您使用的是FileUpload控件,则可以通过 Stream 对象FileUpload.FileContent或作为字节数组FileUpload.FileBytes( API Reference ) 访问用户文件。因为那是Stream您可以即时读取文件而无需先保存它。

标记:

<asp:FileUpload ID="fileUploadControl" ToolTip="Upload a file" runat="server" />

代码隐藏:

If fileUploadControl.HasFile AndAlso _
   (fileUploadControl.FileName.ToLower().EndsWith(".txt") OrElse _
    fileUploadControl.ToLower().FileName.EndsWith(".dat")) Then
    SaveThisToDataBase(fileUploadControl.FileName, fileUploadControl.FileBytes)
End If

看?根本不需要保存到磁盘。fileUploadControl.FileBytes包含上传数据的字节数组。

如果您想保存到文件,那么您可以使用流写入磁盘。

于 2012-10-19T15:24:19.777 回答
3

我不知道我的答案有多“标准”,但这是我在进行类似设置时所做的:

  • 我将文件扩展名限制为少数文件类型,只是为了更难上传坏文件。这很容易规避,但至少这是恶意用户必须采取的又一步。

  • 我必须将 IIS 下的 IUSR 帐户的写入权限添加到我存储文件的文件夹中。此文件夹是我的应用程序根文件夹的子文件夹。

  • 我必须处理很多文件,所以我每个月都创建了一个新的子文件夹,例如Uploaded\012012,Uploaded\022012等。这使得文件访问速度更快,因为每个文件夹中只有几百个文件。我将每次上传都存储在数据库中,并有一个定期清理文件系统的计划任务。这也删除了旧的空文件夹。

正如我所说,我不知道这是否是标准的(或者即使它是一个非常好的做法),但它在我使用它的环境中运行良好。

于 2012-10-19T15:21:38.937 回答