我正在使用 FileUpload
在我的项目中。而且这个项目的访问量会很高(这不是我的野心,只是因为 Web 应用程序确实与支付系统一起工作,这就是为什么它会处于高负载状态)。我想知道,存储用户文件有什么更好的方法?我的项目基于 ASP.NET .
我建议两种变体:
<user_files> ::= ( <id ::= int, primary_key, auto_increment, indexed><user_id ::= int><file_guid ::= varchar(255)>) | nil
我更喜欢 Blob ,但害怕 future 的高负荷。因为,从数据库中获取数据需要更多的 CPU 时间和内存分配,因为:
由于我认为所有这些操作可能会减少服务器工作并且需要更多时间,我认为对于 2000 个在线用户来说会很慢,这将非常快速地交换文件
至于文件系统上的存储文件,我只看到以下问题:
但是,也许,我的想法有问题,这就是为什么我要问你一个建议,因为我想让系统更完美。
谢谢!
最佳答案
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/