【发布时间】:2010-12-21 09:58:59
【问题描述】:
我检查文件的扩展名和 mime 类型 - 我还能做些什么来帮助文件上传更安全?
它是一个头像(所以所有图像都在一个文件夹中)。我正在考虑使用 htaccess 来禁止任何 php 执行,以防万一某些 php 文件在那里找到。你觉得呢?
【问题讨论】:
标签: php file-upload
我检查文件的扩展名和 mime 类型 - 我还能做些什么来帮助文件上传更安全?
它是一个头像(所以所有图像都在一个文件夹中)。我正在考虑使用 htaccess 来禁止任何 php 执行,以防万一某些 php 文件在那里找到。你觉得呢?
【问题讨论】:
标签: php file-upload
文件扩展名和 mime 类型都不能为您处理图像文件提供 100% 的安全性。但只要您不打算执行该文件(例如,通过使用 include()),这不是问题,您不需要检查 PHP 代码或其他任何内容。使用伪造图像文件可以想象的唯一安全漏洞将是利用浏览器的渲染引擎的东西。这是不可能从服务器端有效保护的,这是浏览器供应商的责任。
所以,只要确保在处理上传时使用is_uploaded_file() 和move_uploaded_file(),就应该没问题,至少在图像格式方面是这样。请务必阅读下面@bobince 的帖子并点击链接,其中包含有关处理文件时其他安全方面的大量重要信息。
但是,您当然可以使用 GD 的imagecopy 将图像复制到新的图像容器中,以提供最大程度的安全性。这将清除文件中包含的任何 ID3 和其他标头信息,并可能破坏任何利用尝试(GD 可能会阻塞此类文件并返回错误)。当然,这仅适用于 GIF、JPEG 和 PNG,您可能会遇到一些问题,例如 Alpha 通道和颜色配置文件问题。
【讨论】:
永远不要使用用户提交的文件名;组成新的,如«随机数».jpeg。 “清理”文件名比您想象的要难,尤其是当应用程序需要能够在 Windows 服务器上运行时。
对于图像,使用 PHP getimagesize 函数来确定图像的文件类型,而不是查看高度不可靠的文件名和 mimetype 提交。禁止不解析为图片的上传。
对于要下载的文件,使用Content-Disposition: attachment 标头停止 IE 嗅探 HTML 内容并将其显示在浏览器中。
对于必须内联显示的文件,您必须将它们从不同的主机名提供给您的主站点,否则其中的 HTML 内容可能会跨站点脚本进入您的安全上下文。
李>使文件上传功能安全很难。 More discussion.
【讨论】: