asp.net - 将上传的文件作为 BLOB 存储在 DB 中或有限制的文件夹中,哪里更好?

标签 asp.net security database-design file-upload blob

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

我建议两种变体:

  • 另存为/加载 Blob 对象进出数据库
  • 保存/加载到/从 文件夹 文件将在哪里找到并保存有关表中文件的信息以供所有者识别, 中的表设计BNF :
  • <user_files> ::= ( <id ::= int, primary_key, auto_increment, indexed><user_id ::= int><file_guid ::= varchar(255)>) | nil
    我更喜欢 Blob ,但害怕 future 的高负荷。因为,从数据库中获取数据需要更多的 CPU 时间和内存分配,因为:
  • 我需要使用一个连接器,它将打开一个新套接字来连接到 DB localhost
  • 然后必须调用存储过程来获取 BLOB 对象
  • 在客户端,我必须从连接器
  • 的某些类中获取结果
  • 我必须反序列化它
  • 然后只是将文件以未压缩且未损坏的状态发送给用户,以便用户稍后可以在某些编辑器中打开它(文件通常是图像和 ms-office 文档)

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

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

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

    谢谢!

    最佳答案

    securing correctly the access of files



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

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

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

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

    关于asp.net - 将上传的文件作为 BLOB 存储在 DB 中或有限制的文件夹中,哪里更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16344454/

    相关文章:

    sql-server - sql备用键的主要用途是什么

    mysql - 使用主键进行查询优化

    mysql - 如何为基于邮政编码的服务设计 MySQL 数据库?

    c# - 使用URL在Crystal报表中显示图像

    ASP.net 表单例份验证 - 管理员杀死单个用户的 session

    python - 保护 bottle.py web 应用程序免受 XSS 和 CSRF 攻击的方法?

    php - 如何将登录脚本中的安全性从 MD5 更新为更安全的内容?

    asp.net - 通过 LAN 调试 ASP.NET 云项目

    c# - 获取输入类型 ="number"标签以在服务器上运行

    angularjs - 无法在 Angularjs 版本 1.4.4 中使用 $cookies.putObject 为 cookie 设置安全标志