我们正在构建一个应用程序,用户可以在我们的系统中上传简历供管理员下载。我们正在就限制可以上传的文件的内容类型进行辩论。
我很难准确地将允许上传任何内容类型的安全问题拼凑在一起。
允许上传任何内容类型是否存在安全风险?
我们正在构建一个应用程序,用户可以在我们的系统中上传简历供管理员下载。我们正在就限制可以上传的文件的内容类型进行辩论。
我很难准确地将允许上传任何内容类型的安全问题拼凑在一起。
允许上传任何内容类型是否存在安全风险?
必须注意,文件本身没有固有的“内容类型”。文件是一堆字节,并且有一个名称。当您从 Web 服务器下载文件时,服务器会从它可以找到的任何线索中推断出内容类型(例如“application/pdf”),主要是所谓的“扩展名”(末尾的几个字母)文件名;例如.pdf
,假设“”表示 PDF 文件),有时文件内容本身:例如,当 Web 服务器分发 HTML 文件时,它还会在文件头中查找将覆盖的“元”标签Content-type 的默认选择,如下所示:
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
</head>
所以你在你的服务器上有两个操作:上传和下载。上传大部分是安全的:文件来了,并且被存储了。下载可能令人担忧:当管理员下载文件时,他会通过单击 Web 浏览器中的某个链接来下载文件,而 Web 服务器将推断出内容类型,如上所述。然后,Web 浏览器将使用内容类型来决定如何处理下载的文件,这可能不一定是“建议用户将其保存在某处”。例如,如果有人上传.html
文件,Web 浏览器会将其解释为 HTML,显示并可能执行其中的任何 Javascript。此外,该文件将来自您自己的服务器,因此管理员 Web 浏览器可能会默认信任该文件。那时可能会发生各种令人讨厌的事情。
因此,您应该过滤下载时提供文件的内容类型;还要注意文件名,因为即使该文件只是保存在管理员系统上,它仍然可能是.exe
管理员单击它时将执行的文件。
此外,允许任何类型的文件出现在您的服务器上可能是利用攻击的间接工具。存在一些安全漏洞,攻击者可以通过某种方式强制执行服务器上的任意文件;未经过滤的上传机制允许攻击者首先推送他希望在服务器上执行的可执行文件类型。
通常问题不是由于上传,而是托管和同源/恶意软件问题。
想象以下场景:
https://example.com/alice/foo
.https://example.com/bob/bar
..../alice/foo
,以后再下载.../bob/bar
。Alice 和 Bob 共享一个来源,https://example.com/
。如果文件只是被浏览器视为静态内容,那么这不会带来问题。但如果文件可以包含脚本,那么 Alice 可能会通过 cookie 存储凭据,而 Bob 将能够拦截这些凭据。
许多文件类型都可以嵌入脚本——HTML、SVG、Flash、...等。托管活动内容会引入各种同源问题。