如何保护免受攻击一个PHP图片上传脚本?(How can I protect a PHP image

2019-06-27 23:31发布

我创建(利用脚本 ,并从堆栈一些帮助,并从朋友一些帮助,我知道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,只有我和大约三其他人知道的私人测试页; 没有其他人发送该测试。

这显然有我担心有什么东西hinky怎么回事,我很担心,我不知道足够的安全性,以确保该页面是安全的。

有没有办法,我失去了一些东西明显?

Answer 1:

当上传处理,你应该记住,你可以在$ _FILES数组中查找数据也可以伪造。 它的行驶通过HTTP所以它很容易给人图像/ 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



Answer 2:

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

不要在网站根目录保存上传的文件。 上传的文件应该是只能通过脚本访问,为更好地控制。

不要保存上传的文件与原来的文件名和扩展! 在检索数据库后存储这些数据。



Answer 3:

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

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

一个更好的想法是让你接受,以节省您的文件系统扩展的白色。



Answer 4:

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

存储这些文件的目录,如果你走这途径。

确保该目录仅仅是图像(音乐),然后得到一个脚本通过查看文件格式将正确的扩展他们。

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

这将保证您的安全。



文章来源: How can I protect a PHP image upload script from exploits?
标签: php security