在asp.net Web应用程序中使用用户上传文件的标准做法

时间:2012-10-19 15:16:41

标签: c# asp.net file-upload

这是我第一次构建一个Web应用程序,仅用于处理用户上传的文件,关于如何正常完成,我有几个问题:

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

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

  3. 构建具有我错过的类似功能的网络应用还有其他重要方面吗?

  4. 由于

2 个答案:

答案 0 :(得分:6)

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

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

  3. 定义一个超时,这样大的上传文件最终不会占用不必要的服务器进程,无论如何它都太大了。

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


    编辑回答评论:

    通过在内存中工作,我正在谈论操作纯粹通过代码上传的文件,而无需将其物理地保存在服务器的磁盘上。

    例如,如果您使用FileUpload控件,则可以通过Stream对象FileUpload.FileContent或字节数组FileUpload.FileBytes({{3})访问用户的文件})。由于这是一个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包含上传数据的bytearray。

    如果要保存到文件,则可以使用该流写入磁盘。

答案 1 :(得分:3)

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

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

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

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

正如我所说,我不知道这是否是标准的(或者即使这是一个非常好的做法),但它对我使用它的环境很有效。