我想存储(可能不受信任的)随机用户上传的文件。我主要担心的是安全性。在我看来,将文件存储在MySQL数据库中是最安全的事情,因为如果没有我的脚本将它们加载到SQL数据库之外它们肯定无法访问/执行,这只会对授权用户执行。
然而,我已经阅读了很多关于在文件系统中存储文件的方法,这是最好的方法,大多没有真正的解释。我找到的唯一缺点是性能。它实际上是慢得多还是还有其他我不知道的缺点?
答案 0 :(得分:2)
认为数据库本质上比磁盘上的文件更安全是不正确的。毕竟,数据库中的是文件。进入MySQL服务器通常比通过shell访问机器容易得多,MySQL使用密码和shell,如果配置正确,只使用SSH密钥。
另一个问题是,当您将越来越多的二进制数据加载到数据库中时,正确备份会变得相当昂贵。 MySQL不能很好地进行差异备份,而使用像rsync
这样的工具快速有效地复制磁盘上的文件是微不足道的。
文件系统毫不奇怪,非常擅长存储大量任意二进制数据。关系数据库不是。此外,在操作系统级别已经完成了大量工作,以尽可能高效地从磁盘上提供服务文件。
以下是计算机从磁盘获取文件并将其发送到网络所需执行的操作:
sendfile
的系统调用。以下是从MySQL等数据库发送它所需要做的事情:
SELECT file FROM tablename WHERE id=?
由于多次跨越用户空间/内核空间边界,这需要更多工作并涉及大量强制拷贝。
如果您需要文档存储,请查看类似Riak的内容,而不是像MySQL这样的RDBMS。
答案 1 :(得分:1)
网站运营人员的一般经验是将上传的文件存储在文件系统上
而不是将它们存储在数据库列中。
为什么呢? Web服务器和Web缓存代理服务器旨在从文件系统向用户提供文件。一组Web服务器可以非常有效地完成此任务,就像一台服务器一样。
从dbms传递文件使其成为瓶颈。您通常有多个Web服务器和一个dbms。另外,BLOB数据的处理速度比普通数据慢。
这是一种广泛使用的技术,可以解决安全问题。它们是真正的问题,但已经解决了。最大的问题是坏人猜测私人文件的路径名称的容易程度。