如何保护PHP图像上载脚本免受攻击?

时间:2012-09-07 13:18:50

标签: php security

我已经创建了(使用a script和来自Stack的一些帮助以及来自朋友的一些帮助;我对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。这是一个私人测试页面,其中包含一个非直观的网址,只有我和其他三个人都知道;其他人都没有发过这个测试。

这显然让我担心会发生一些变态,我担心我对安全性的了解不足以确保此页面安全。

有什么明显的东西让我失踪吗?

4 个答案:

答案 0 :(得分: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-上传文件夹 除了你已经做过的事情:

确保您的上传文件夹无法通过网络获得。验证上载的文件,然后根据需要将其移动到其他文件夹并重命名该文件。 它将阻止黑客执行恶意文件(如果网址无法访问,则无法执行)。

进一步阅读:https://www.owasp.org/index.php/Unrestricted_File_Upload

答案 1 :(得分:4)

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

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

不要使用原始文件名和扩展名保存上传的文件!将此数据存储在数据库中以便以后检索。

答案 2 :(得分:0)

你可以检查文件的MIME类型,但是不要担心,只要你的php处理程序只能执行.php文件而你正在处理没有在脚本中保存上传的.php文件,你就是不暴露任何安全漏洞。

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

更好的想法是保留您要接受的扩展名以保存在文件系统上。

答案 3 :(得分:0)

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

如果您沿着那条大道走下去,请将这些文件存储在目录中。

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

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

这会让你安全。