PHP上传漏洞的分析和解决方案

来源:互联网 发布:拓普集团 知乎 编辑:程序博客网 时间:2024/06/13 04:02

导读:这个话题,其实很多安全网站都在说,也没有什么高深的内容,归纳,规整纳为己用。

详细:

主要是抓包伪造的漏洞。

L1 没有做file_type校验,直接转存”用户“上传文件;(恶劣的后端校验)

L2 使用PHP预定义变量$_FILES的type属性做校验;(可以对数据进行伪造)

L3 使用Fileinfo扩展(PHP5.3后就默认安装了)进行校验。(我所知较安全的方案)

在上传文件时候,除了大小做常规校验外,还需要对类型做校验——不管是图片、文档类型等等。而更加安全的做法,可以采用强制重命名,类似QQ的离线的做法。这里的重命名,对于PHP来说,tmp_name 已经重命名了,增加后缀名即可。

上代码:

<?php// 面向过程$file_info = file_info_open(FILEINFO_MIME_TYPE); $filename = 'aa.png';echo file_info_file($file_info, $filename);file_info_close($file_info);// 面向对象$filename = 'aa.png';$file_info = new file_info(FILEINFO_MIME);$type = $file_info->file($filename);$mime = substr($type, 0, strpos($type, ';'));echo $mime;

好了。

如果当前生产环境不是php5.3呢,这里提供之前一位同事的办法:

/* * 处理原理:对图片类型进行简单的检测,并以原图进行重新生成(重新生成会打乱其中的恶意代码) * 处理方法(用此方法替换move_uploaded_file): * 进行简单图片判断并上传(jpg,gif,png) * @param $file  $_FILES['']获取的值 ; $path 图片生成的物理路径(包含图片名称) * return 上传成功 true ;  图片类型异常 -1 ;上传失败 false; */function image_save($file, $path) {    if ($file["type"] == "image/gif") {        @$im = imagecreatefromgif($file['tmp_name']);        if ($im) {            $sign = imagegif($im, $path);        } else {            return -1;        }    } elseif ($file["type"] == "image/png" || $file["type"] == "image/x-png") {        @$im = imagecreatefrompng($file['tmp_name']);        if ($im) {            $sign = imagepng($im, $path);        } else {            return -1;        }    } else {        @$im = imagecreatefromjpeg($file['tmp_name']);        if ($im) {            $sign = imagejpeg($im, $path, 100);        } else {            return -1;        }    }    return $sign;}
原文地址:http://alfred-long.iteye.com/blog/1725628
感谢 i飞行的部落

原创粉丝点击