说服系统管理员文件上传是可以的吗?

说服系统管理员文件上传是可以的吗?

尽量简短地说:最近,我们的系统管理员注意到(这种事情应该如此),我们最新的基于 Web 的项目的要求之一是允许客户执行文件上传。具体来说,这些文件主要是图像,也可能是视频 [,但我相信您知道,在文件到达服务器之前,您无法保证上传的确切内容是什么]。

系统管理员有些不耐烦,差点就直接说“不!”。

我熟悉许多有关用户输入、处理上传等方面的最佳实践,因此我对这个项目的幕后/代码方面非常有信心。我的问题是,是否有任何特定的资源或谈话要点可以帮助系统管理员缓解压力?我应该重点向他解释这类事情,如何处理等?

一些担忧是潜在的存储空间(我知道需要根据估计的“受欢迎程度”乘以估计的文件大小来计算)和托管上传内容的安全问题。

答案1

归根结底,您和管理员都是为了满足业务需求而存在的。挑战在于找到功能性(上传文件)和非功能性(安全性、磁盘成本、性能)方法之间的正确平衡。

  • 将允许的文件类型列入白名单,以便该网站不会成为某人的个人 MP3 存档网站。
  • 设置合理的文件上传大小,并设计一种方式让管理员能够协助解决较大但必要的文件上传大小问题。
  • 实施速率限制。Jane 真的需要同时上传 5 个文件,或者一天上传 300 个文件吗?通常,这些应该设置为普通用户看不到但攻击者却能看得见的速率。
  • 了解应用程序消耗资源的方式 - 内存和磁盘。如果您要进行分块,您将如何清理丢失的会话?上传 10 MB 文件时,服务器上会消耗多少内存?
  • 了解数据的生命周期。什么时候不再需要它?什么触发了它的删除?
  • 当防病毒软件隔离上传的文件时,您的应用会做什么?

答案2

所有建议检查文件扩展名以确保安全的人都是疯子。将 exe 或 mp3 重命名为 gif 很容易。上传 MIME 类型也是如此。

仅有的确定上传类型的方法是解析它;查找文件中的文件签名,将其加载到图像处理器中,看看它是否会阻塞,等等。

您还需要做什么取决于您的操作系统和网络服务器,但通常上传的文件不应放在单独的磁盘上,这样当有人上传大量文件并占用所有空间时,您就不会关闭您的操作系统。无论文件上传到哪里,都不应包含执行权限,这样就没有人可以通过浏览器从那里运行文件(以防它是您正在使用的任何网络语言的脚本),甚至最好根本不允许直接引用它,通过实用程序页面提供文件,并使用类似 GUID 的内容作为参数(例如 displayImage?id=0000-000000-0000-0000)

当然还要进行病毒扫描,限制最大上传大小(但要注意,例如,IIS6 无法在中途检查流长度,因此会将上传存储在内存中直到完成,然后将其传递到您的 asp.net 应用程序)

答案3

阅读此网站:http://www.owasp.org/index.php/OWASP_Top_Ten

您会注意到“上传神奇损坏的 Apache”并不是一个众所周知的安全漏洞。

Apache 上传处理会被搞砸——而且会搞砸得很严重——但你真的必须通过忽略 OWASP 漏洞列表来努力做到这一点。

此外,您的框架(您没有提到)有以安全方式处理上传的具体指导方针。如果它没有任何上传规定,那么请跑去(不要走)寻找更好的框架。


“[,但我相信你知道,在文件到达服务器之前,你无法保证文件的具体内容]。”

远非如此。即使它对你的特定框架来说是正确的,也是无关紧要的。

文件通过缓冲区传递。Python 框架使上传文件在缓存中可用(如果文件很大)或在内存中可用(如果文件很小)。即使文件在文件支持的缓存中,它也不是“真正”存在于文件系统中。它没有最终名称或权限 - 它只是字节。

字节不会神奇地破坏 Apache。具有愚蠢所有权(和/或其权限中的 setuid 位)的可执行文件会破坏 Apache。

上传的诀窍是 (a) 利用框架的缓存,(b) 在将数据保存到任何地方之前对其进行验证,(c) 将其保存在某个不可执行的位置——某个 Apache 无法查找可执行文件的位置,以及 (d) 在任何情况下都不要这样做chmodchown如果将不可执行的上传命名.htaccess为您将其写入 Apache 从中获取它的目录,则它可能会导致问题——只需设置此目录的权限并且从不命名上传的文件,即可轻松阻止此操作.htaccess

漏洞非常少。它们都有很好的记录。而且您的框架已经处理了这个问题。

答案4

请记住,您可以验证上传文件的类型(使用 MIME 类型检测;在 PHP 中有多种方法可以执行此操作,或者使用外部实用程序,例如file),并且您可以再次使用外部实用程序对它们进行病毒扫描。

据推测,一旦您处理并验证了上传的文件,您就会将其移动到最终位置,并且会拒绝未通过这些阶段的文件;如果是这样,您可以向管理员解释,您只会保存“安全”文件。

您可以先问他对这个问题的主要痛点是什么;他是否担心安全性,是否负责发布其他用户提供的内容(以及由此引发的任何最终用户安全问题),或者他是否担心基础设施问题——存储、网络等。

注意:上面的“安全”是指检查范围内的安全。显然,您无法保证用户提供的任何内容绝对安全。

相关内容