用户上传文件的安全性

1 投票
1 回答
824 浏览
提问于 2025-04-17 07:48

我有一个客户的Python网站,里面有一个类似Dropbox的功能,可以上传文件。

我想确保上传文件不会让服务器变得脆弱,容易受到攻击。

所以,我把所有上传的文件存储为二进制大对象(blob)在Postgres数据库里,并且不信任文件的名称和扩展名,而是让应用程序自己来判断这些。

在尝试让应用程序自己决定文件格式时,我遇到了一些问题,所以我的问题归结为:

  1. 为了安全起见,是否有必要限制允许上传的文件格式?
  2. 如果需要限制,那么如果不使用像libmagic这样的工具,我该如何以最好的方式判断文件格式?
  3. 在允许公众上传文件时,还有其他安全措施需要采取吗?

谢谢。

1 个回答

0

提到的这个“bug”问题(链接到这个)其实并不是在说有bug,而是说一些MS Office的文件类型,像Java的jar文件一样,是打包并压缩成zip文件的。如果你把一个.xlsx文件的后缀改成.zip,就可以查看里面的内容——我在一个简单的例子中发现了13个.xml文件和一个.bin的打印设置文件。

为了安全起见,你不能完全相信用户提供的文件类型和后缀名,但原则上你可以用它们来验证文件内容是否符合所声称的文件类型。第一步检查就是确保这些声称的Office文件实际上是有效的zip文件,第二步则是检查里面的内容是否符合Office应用程序的预期。由于我不是Office的开发者,所以我不知道有没有方法可以检查一个zip文件,确定它是为哪个Office应用程序准备的,并验证这个应用程序是否能打开它,但我相信在MSDN上肯定有相关的信息。

更根本的问题是,你所说的“安全对我的应用程序很重要”是什么意思?安全是为了防止不想要的事件发生——你需要明确你想要防止什么。你希望用户只能上传白名单上的应用程序的文件吗?是否应该阻止他们上传黑名单上的文件类型(比如.exe)?如果一个用户上传了10MB的随机数据并称之为.xyz文件,你觉得可以吗?

撰写回答