C# 在asp.net web应用程序中使用用户上载文件的标准实施规程

C# 在asp.net web应用程序中使用用户上载文件的标准实施规程,c#,asp.net,file-upload,C#,Asp.net,File Upload,这是我第一次为处理用户上传的文件而构建web应用程序,我有一些关于如何正常完成的问题: 我是否需要考虑任何安全问题?要处理的文件本质上是我的应用程序逐行读取的文本文件。我是否应该限制文件上载扩展名和/或是否应该考虑任何其他预防措施 上传文件的最佳组织方式是什么?这些文件不需要永久存储在我的应用程序中,所以我是否应该将它们转储到一个普通的“数据”文件夹中,并删除不再需要的文件 在构建具有类似功能的web应用程序时,我是否还遗漏了其他重要方面 谢谢我不知道我的答案有多“标准”,但以下是我在进行类似设

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

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

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

  • 在构建具有类似功能的web应用程序时,我是否还遗漏了其他重要方面


  • 谢谢

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

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

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

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

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

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

  • 保存到磁盘可能需要花费大量事务,但另一方面,当使用更多请求/线程时,它会减少服务器内存的混乱。您也可以处理内存中的文件,但对于大文件,它可能最终有害。考虑一下你在做什么,选择最好的方法。

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

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


    编辑以回答评论:

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

    例如,如果您正在使用
    FileUpload
    控件,则可以通过流对象
    FileUpload.FileContent
    或作为字节数组
    FileUpload.FileBytes
    ()访问用户的文件。因为这是一个
    ,所以您可以动态读取文件,而不必先保存它

    标记:

    <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
    包含上传数据的字节数组


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

    如果不需要存储文件,可以组织哪些内容?只需读取流,处理它并丢弃。如果不需要,则无需实际保存文件。@Jamiec我不知道您可以这样做。您是说文件在客户端读取,数据发送到服务器吗?您可以如何执行此操作?@Tony该文件由浏览器读取并发送到服务器。如果您想在内存中读取流,您可以在处理完后将其丢弃。不过,这可能会给服务器带来压力,具体取决于您的流量。将文件保存到磁盘的速度肯定较慢,但在给定时间使用的资源较少,如果出现问题,您可以延迟处理。我的数据库查询是参数化的,因此注入应该可以。这些文件相对较小,但我不熟悉你所说的在内存中处理文件的意思。您是否有任何示例或参考链接?