4

我正在FileUpload我的项目中使用。而且这个项目的访问量会很高(这不是我的野心,只是因为 Web 应用程序确实与支付系统一起工作,这就是为什么它会处于高负载状态)。我想知道,存储用户文件有什么更好的方法?我的项目基于ASP.NET

我建议两种变体:

  • 将BLOB对象另存为/加载到/从数据库中
  • 保存/加载到/从文件将找到的文件夹并保存有关表中文件的信息以供所有者识别, BNF中的表设计:

<user_files> ::= ( <id ::= int, primary_key, auto_increment, indexed><user_id ::= int><file_guid ::= varchar(255)>) | nil

我更喜欢BLOB,但害怕未来的高负载。因为,从数据库中获取数据需要更多的 CPU 时间和内存分配,因为:

  • 我需要使用一个连接器,它将打开一个新的套接字来连接到 DB localhost
  • 然后必须调用存储过程来获取 BLOB 对象
  • 在客户端,我必须从连接器的某些类中获取结果
  • 我必须反序列化它
  • 然后只是将文件以未压缩且未损坏的状态发送给用户,以便用户稍后可以在某些编辑器中打开它(文件通常是图像和 ms-office 文档)

由于我认为所有这些操作可能会减少服务器工作并且需要更多时间,我认为对于 2000 个在线用户来说会很慢,这将非常快速地交换文件

至于文件系统上的存储文件,我只看到以下问题:

  • 正确保护文件的访问,因为不同的用户不能看到其他文档,并且必须为其他用户隐藏它们。恐怕,因为 IIS 的 Windows 系统用户(IISUser ...)可以看到用户上传文件的文件夹,否则用户将无法上传任何内容,因此该文件夹将是公共的. 我只看到了制作 Windows 服务并将 IIS 文件夹用于临时上传的解决方案。Windows 服务将从它获取文件并放置到安全文件夹中,Web 用户将无法在该文件夹中看到它。

但是,也许,我的想法有问题,这就是为什么我要问你一个建议,因为我想让系统更完美。

谢谢!

4

2 回答 2

3

正确保护文件的访问

如果您遇到这种情况,您已经违反了 OWASP 安全准则,因为您的文件是不安全的直接对象引用。这意味着用户可以直接访问文件,因为您在 IIS 上打开了一个完整的子文件夹(如 www.mysite.com/files/some_file.pdf)并且您的文件可能有一个名称。

你应该做的是:

  1. 在数据库中注册一个具有唯一性的文件;不是它的数据,只是它的名称和上传它的用户(可选地包括权限或角色)。
  2. 将文件存储在磁盘上,其中文件名是数据库标识符。
  3. 不允许直接访问,而是编写一个特殊的 HttpHandler 来接收文档的 id(就像在数据库中存储文件时所做的那样)。

采用这种方法时,您可以实现以下目标:

  1. 文件具有唯一编号,可防止它们在磁盘上发生命名冲突。
  2. HttpHandler 可以检查下载该文件的用户的数据库是否具有这样做的适当权限。
  3. 因为使用了 ID,所以您不容易受到规范表示攻击,攻击者会执行如下请求:www.mysite.com/file.ashx?file=..\web.config.

因此,从安全角度来看,将文件存储在磁盘而不是数据库上是没有问题的。

于 2013-05-02T18:07:08.047 回答
2

随着时间的推移,存储在数据库中会更好地扩展。如果您使用文件夹解决方案,并且有一天您需要或决定使用集群,那么在整个服务器场中同步文件将会非常糟糕。

尽管从数据库中获取内容可能会占用更多 CPU 资源,但它确实简化了很多事情(您的代码肯定会更易于维护和移植),并且您始终可以指望托管和处理成本会随着时间的推移而减少。

您还可以缓存内容以提高速度。无论哪种方式,我希望这些文件在上传后不会有太大变化。

于 2013-05-02T17:54:15.080 回答