2012-09-07 110 views
7

我创建了一个简单的页面(使用a script以及Stack的一些帮助和朋友的一些帮助;我对PHP知之甚少)一个简单的页面供当地非盈利出版物供人们上传照片。如何保护PHP图像上传脚本免受攻击?

我不是伟大的安全性(从无知,不是故意疏忽的基础上),但我已经采取了以下措施来保护这个页面:

•PHP脚本设置为只接受.JPG ,.png和.tif文件上传;
•保存表单内容的子文件夹的权限设置为700,保存上传照片的子文件夹的权限设置为700;
•根据文档,我的主机具有以下配置,以确保只有.php文件作为.PHP运行:

<FilesMatch \.php$> 
    SetHandler php52-fcgi 
</FilesMatch> 

•我已经把相关的.htaccess文件(主要和保存的内容)文件夹:

RemoveHandler .php 
RemoveHandler .inc 
RemoveHandler .pl 
RemoveHandler .cgi 
RemoveHandler .py 
RemoveHandler .fcgi 

一夜之间,然而,有人发现了这个测试页面,并提交似乎是完全良性的测试消息和小.JPG。这是一个带有非直观URL的私人测试页面,只有我和其他三个人都知道;其他人都没有发送这个测试。

这显然让我担心有些事情会发生,我担心我对安全性不够了解,以确保此页面安全。

有什么明显的我失踪了吗?

+0

用户给出的文件名(在'$ _FILES ['upload'] ['name']')是不可信的,可以很容易地改变。不要检查这些扩展名。如果检查'getimagesize()'是否返回有效结果,请检查mime类型。如果可能,生成你自己的文件名 – MarcDefiant

回答

8

在处理上传时,应该记住,您可以在$ _FILES数组中找到的所有数据都可以伪造。它通过HTTP传输,因此将image/jpg mime提供给可执行文件非常容易。

1-检查真正的哑剧

PHP想出一些功能来检查文件的真实MIME。对于您应该使用fileinfo

$finfo = new finfo(FILEINFO_MIME, "/usr/share/misc/magic"); 
$filename = "/var/tmp/afile.jpg"; 
echo $finfo->file($filename); 

2 - 查看图像的特性

你显然希望只上传图片,所以接收到的文件必须有一个宽度和高度:

使用getImageSize()获取有关图像的所有必需信息。如果它返回false,则该文件可能不是图像,您可以将其删除。 getImageSize也可以给你一个MIME类型,但我不知道它是否可信。

2.5重新处理图像

至于建议的user628405,后处理与GD图像可能是做的更安全的事情。

$img = imagecreatefrompng('vulnerable.png'); 
imagepng($img, 'safe.png'); 

很明显,它必须根据图像类型进行调整。在php文档中查看所有imagecreatefrom *。

3-上传文件夹 另外的什么你已经这样做:

确保您上传的文件夹不可用从网络。验证上传的文件,然后将其移至其他文件夹(如果需要)并重命名该文件。 它将防止黑客执行恶意文件(如果无法通过url访问,则无法执行)。

延伸阅读:https://www.owasp.org/index.php/Unrestricted_File_Upload

+2

有一次,当有人用'<?php phpinfo();>插入到二进制数据中时,我上传到了我的web服务器PNG文件中。此代码不可执行,但仍可通过include()函数访问。不幸的是,'getimagesize()'返回了非假值。我管理这种情况,通过'$ img = imagecreatefrompng('vulnerable.png')重新保存所有上传的图像; imagepng($ img,'safe.png');' – CodingHamster

+0

我对这一切都很陌生,不怕做我自己的家庭作业,但有几个问题:首先,我会添加fileinfo和getImageSize命令,以及脚本的“案例文件”部分中的文件重命名位? – JeanSibelius

+0

所有检查必须尽快在'$ _FILES ['my_files'] ['tmp_name']'变量上完成;如果一切顺利,你可以移动文件,重新命名,并做任何你需要做的事情。 – grunk

0

您可以检查文件的MIME类型,但不要担心,只要您的PHP处理程序只能执行.php文件,并且您正在考虑不在您的脚本中保存上传的.php文件,不要泄露任何安全漏洞。

这对于.php文件以及服务器上安装的任何其他服务器端脚本语言都是有效的。

一个更好的主意是保留一个白色的扩展名,你可以保存在你的文件系统上。

+1

这与场地上传并不直接相关,但您可以上传带有一些苹果形式的PHP代码的图像作为评论。如果网站上存在LFI漏洞,您可能会包含图像并执行恶意代码。 – MarcDefiant

0

我会忽略传入文件的MIME类型和文件扩展名。这些可以是假的。

如果你沿着那条街道存放这些文件在一个目录中。

确保该目录仅用于图像(音乐),然后通过查看文件格式获取脚本以在其上放置正确的扩展名。

还要确保该目录不能执行PHP(或其他任何东西)。

这会让你安全。

4

不要依赖于从客户端,包括内容类型的任何数据!

不要将上传的文件保存在web根目录下。上传的文件应该只能通过脚本访问,以便更好地控制。

请勿使用原始文件名和扩展名保存上传的文件!将这些数据存储在数据库中供稍后检索。

相关问题