如何在PHP中制作安全的文件上传脚本?

时间:2009-11-29 16:07:06

标签: php file-upload

我检查文件的扩展名和mime类型 - 还有什么我可以做的,以帮助使文件上传更安全吗?

用于化身(因此所有图像都在一个文件夹中)。我正在考虑使用htaccess来禁止任何php执行只是因为某些php文件在那里找到了它的方式。你觉得怎么样?

2 个答案:

答案 0 :(得分:19)

文件扩展名和mime类型都不能为您提供处理图像文件的100%安全性。但只要您不打算执行该文件(例如使用include()),这不是问题,您不需要检查PHP代码或其他任何东西。使用伪造图像文件可以想象的唯一安全漏洞可能会利用浏览器的渲染引擎。这不可能有效地防止服务器端,并且是浏览器供应商的责任。

因此,只要您确保在处理上传时使用is_uploaded_file()move_uploaded_file(),就应该没问题,至少在图像格式方面是这样。请务必阅读下面的@ bobince帖子并点击链接,它在处理文件时包含一些关于其他安全方面的重要信息。

然而,您可以提供完全最高的安全性,当然可以使用GD imagecopy将图像复制到新的图像容器中。这将删除文件中包含的任何ID3和其他头信息,并可能破坏任何漏洞利用尝试(GD可能会阻塞此类文件并返回错误)。当然,这仅适用于GIF,JPEG和PNG,您可能会遇到一些问题,如Alpha通道和颜色配置文件问题。

答案 1 :(得分:17)

  1. 永远不要使用用户提交的文件名;组成新的,如“随机数”.jpeg。 “消毒”文件名比你想象的更难,特别是如果应用程序需要能够在Windows服务器上运行。

  2. 对于图像,使用PHP getimagesize函数来确定图像的文件类型,而不是查看高度不可靠的文件名和mimetype提交。禁止不解析为图像的上传。

  3. 对于要下载的文件,请使用Content-Disposition: attachment标头停止IE浏览HTML内容并在浏览器中显示。

  4. 对于必须以内联方式显示的文件,您必须从主站点的其他主机名提供这些文件,否则其中的HTML内容可以跨站点脚本进入您的安全上下文。

  5. 确保文件上传功能安全难以More discussion