是否存在安全问题需要考虑?要处理的文件本质上是文本文件,我的应用程序将逐行读取。 我应该限制文件上传扩展名或者还有其他预防措施吗?
对于已上传的文件,什么是最好的组织方式?这些文件不需要永久存储在我的应用程序中,所以我应该将它们放在一个通用的“数据”文件夹中并删除不再需要的文件吗?
我是否忽略了任何其他重要方面来构建具有类似功能的网络应用程序?
谢谢
是否存在安全问题需要考虑?要处理的文件本质上是文本文件,我的应用程序将逐行读取。 我应该限制文件上传扩展名或者还有其他预防措施吗?
对于已上传的文件,什么是最好的组织方式?这些文件不需要永久存储在我的应用程序中,所以我应该将它们放在一个通用的“数据”文件夹中并删除不再需要的文件吗?
我是否忽略了任何其他重要方面来构建具有类似功能的网络应用程序?
谢谢
唯一需要注意的安全问题是在将未经数据清洗以防止 SQL 注入的原始文本插入数据库时。如果没有涉及到数据库,那么就没问题了。至于扩展名,限制扩展名只是一个很差的顶级过滤器。虽然有用,但它只是表面检查文件的内容。设置文件大小限制也会有所帮助。
将文件保存到磁盘可能会在大量事务中变得昂贵,但另一方面,随着更多请求/线程的使用,它会占用更少的服务器内存。您还可以在内存中处理文件,但对于大文件,这可能会导致不利影响。考虑您正在处理的内容并选择最佳方法。
定义超时时间,以便上传的大型文件在最终太大时不会占用不必要的服务器进程。
我假设您正在使用 ASP.NET 的 FileUpload
控件。请注意,文件不会通过 postback 持久化(以防止安全漏洞),因此用户每次请求页面时都必须浏览文件。如果您有服务器端验证程序,则这很麻烦。
编辑以回答评论:
通过在内存中工作,我是指纯粹通过代码操作上传的文件,而不必先将其物理保存在服务器磁盘上。
例如,如果您正在使用 FileUpload
控件,则可以通过 Stream 对象 FileUpload.FileContent
或字节数组 FileUpload.FileBytes
(API 参考)访问用户的文件。由于这是一个流,因此您可以直接读取文件,而无需先保存它。
标记:
<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
包含上传的数据的字节数组。
如果您想要保存到文件,那么可以使用流将其写入磁盘。
我限制文件扩展名为少数几种类型,这样可以更难上传恶意文件。虽然很容易规避,但至少增加了恶意用户的一道防线。
我必须为IIS下存储文件的文件夹添加IUSR帐户的写入权限。此文件夹是我的应用程序根目录的子文件夹。
因为我处理了大量的文件,所以我为每个月创建了一个新的子文件夹,例如Uploaded\012012
、Uploaded\022012
等。这样做可以加快文件访问速度,因为每个文件夹中只有几百个文件。我将每个上传文件都存储在数据库中,并定期清理文件系统。这也会删除旧的空文件夹。