为了尽可能缩短这个时间:最近引起了我们的系统pipe理员的注意(这种情况应该是这样),我们最新的基于networking的项目的要求之一就是允许客户执行file upload。 特别是这些将主要是图像和可能的video[,但是我相信你知道,你不能保证上传的确切内容,直到它在服务器上]。
系统pipe理员相当有一些推迟,并没有一个公然的“不!”。
我熟悉许多关于用户input,处理上传等的最佳实践,所以我对这个项目的幕后/代码方面非常有信心。 我的问题是, 是否有任何具体的资源或谈话的要点,以缓解我的系统pipe理员的头脑? 我应该专注于向他解释这种事情,如何处理等等。
一些担心是潜在的存储空间(我知道需要基于估计的“stream行度”时间估计文件大小来计算)以及托pipe上载内容的安全问题。
在这一天结束的时候,你和pipe理者都在那里支持企业的需求。 面临的挑战是在function(上传文件)和非function(安全,磁盘成本,性能)方法之间find适当的平衡点。
大家谁build议检查文件扩展名,以确保你的安全是疯了。 很容易重新命名一个EXE或一个MP3到一个GIF。 同上传MIMEtypes。
确定上传types的唯一方法是parsing它; 查找文件中的文件签名,将其加载到image processing器中,看看是否窒息等等。
您还需要做什么取决于您的操作系统和Web服务器,但通常上传不应该到单独的磁盘上,所以当有人上传大量文件并占用所有空间时,您不会杀死您的操作系统。 无论上传哪个地方都不应该包含执行权限,所以没有人可以通过浏览器从那里运行一个文件(以防万一它使用任何web语言的脚本),甚至更好的是不允许直接引用它完全可以通过一个像GUID这样的参数(例如displayImage?id = 0000-000000-0000-0000)的实用程序页面来提供文件。
当然,病毒扫描,限制最大上传大小(虽然要小心,IIS6例如无法检查stream长度中途,所以将上传内存直到它完成,然后将其传递到您的asp.net应用程序)
阅读本网站:http://www.owasp.org/index.php/OWASP_Top_Ten
你会注意到,“上传神奇地损坏的Apache”不是一个众所周知的安全漏洞。
Apache的上传处理可能会被破坏 – 而且糟糕透顶 – 但是你必须忽略OWASP漏洞列表来处理它。
此外,你的框架 – 你没有提到 – 有一个安全的方式处理上传的具体指导方针。 如果没有任何上传的条款,那么运行 – 不要走 – 更好的框架。
“[但是,正如我确信你知道的,你不能保证上传的确切内容是什么,直到它在服务器上。”
远非如此。 即使对于您的特定框架是正确的,也是无关紧要的。
文件通过缓冲区。 Python框架使上传可用caching(如果它是巨大的)或内存中(如果它很小)。即使它在文件支持的caching中,文件系统也不是“真正”的。 它没有它的最终名称或权限 – 这只是字节。
字节不会魔法腐蚀Apache。 拥有愚蠢所有权的可执行文件(和/或其权限中的setuid位)会破坏Apache。
上传的技巧是(a)利用你的框架的caching,(b)在将数据保存到任何地方之前validation数据,(c)将它保存在某个不可执行的地方 – 某处Apache不能查找可执行文件,以及(d)在任何情况下chown
任何东西。 如果命名为.htaccess
并且将其写入Apache从中获取此目录,则非可执行上载可能会导致问题 – 通过在此目录上设置权限并且永远不会命名上传文件.htaccess
,很容易阻止该操作。
有很less的漏洞。 他们是有据可查的。 而你的框架已经处理了这个。
如果这是业务需求的重要组成部分,那么只要遵循安全协议(即filter文件扩展名/types,MIMEtypes,文件大小等),我无法看到他是如何拒绝的。
假设他是企业阶梯的一部分(而不是公司中唯一的系统pipe理员)尝试去找他的主pipe并解释你的情况。
请记住,您可以validation上传文件的types(使用MIMEtypes检测;有多种方法可以在PHP中执行此操作,也可以使用file
等外部实用程序),并且可以使用外部效用。
据推测,一旦你已经处理和validation上传的文件,你会把它移到它的最终位置,你会拒绝不通过这些阶段的文件; 如果是这样的话,你或许可以向pipe理员推荐你只保存“安全”文件。
你可以先问问他关于这个问题的主要痛点是什么; 他关心的是安全/安全,负责发布其他用户提供的内容(以及引发的任何最终用户安全隐患),还是担心存储,networking等基础设施问题。
注意:上面的“安全”是指执行检查时的安全性。 显然,你不能保证用户提供的任何东西的绝对安全。
file upload可能会比较复杂,安全性也很高。
为了有一个足够安全的应用程序,你将需要…
那么这也取决于你对最终用户的信任。 如果它是一个可以跟踪所有事情的内联网,那么你不需要像公共网站那么多的安全措施! 如果用户知道,你将不必检查一切。
另一个良好的完整性检查 – 不要将file upload到磁盘,而是将它们存储在数据库中。 这会杀死经典的“上传恶意文件,然后在服务器上下文中执行恶意文件”,因为这些文件在服务器上不存在。
现在,如果您在使用数据库备份的文件时遇到性能问题,可以随时提供有关下载文件的信息。
曾经是pipe理员说,“呃,不”。 对于要求将file upload到服务器的开发人员,我可以告诉你在一个应用程序中寻找的东西。 主要的限制是,除非我们正在讨论一个专用的Web服务器,否则我们的Web服务器并没有考虑大规模文件存储的大小。
几年前我曾经工作过的初创公司之一就是Linux上的一个video和图像上传网站(所以我所有的例子都是来自这个网站的)。 允许上传有许多事情可能会出错。
所有上传系统都应将原始格式转换为标准格式。 这样做的好处是双重的。 首先,你现在有一个标准的格式,使您的HTML显示图像和video更容易。 下一步,如果你有一点确信,你已经改变了足够的文件,你不托pipe受感染的文件。 如果您打算通过任何使用电子邮件地址的用户提供原始上传的文件,则可能会遇到相当多的麻烦。
正如其他人所提到的,你需要的不仅仅是检查扩展名。 这是一个难以解决的问题。 我们采取了一些刺激,我从来没有满意,但值得这样做的原因有两个。 最重要的是,你可能会有多条path来转码video。 video来自许多不同的容器,以及数百万个audio和video轨道的组合。 您对文件了解得越多,您将如何处理该文件或最终拒绝该文件就越好。
假设您正在对文件进行代码转换,那么在ffmpeg或libgd等处理库中很容易受到攻击。 我们将原始文件写入NFS共享的磁盘,然后在jail / chroot环境中产生处理。 这使我们能够转换成新格式,或者在一个目录中失败,而不会感染服务器或任何其他文件。 此外,您的代码转换系统需要是最新的,所以你需要每晚检查你的发行版,以确保libpng,libtiff,libmad,libdv等底层库没有任何当前的安全漏洞。
回到原来的问题,确保你正在解决所有人指出的问题,你应该没有问题让你的系统pipe理员在船上,并最终有一个更好的应用程序。 不幸的是,你的系统pipe理员的工作是“不”的东西,看起来像他们将是一个可操作的噩梦支持。