如果我们要用exif_imagetype函数,必须要开启php_exif模块
php.ini在C:\phpStudy\php53文件夹里面,你用的是那个php版本,那就是那个文件夹
把前面的分号去掉
找到[exif]段,把下面语句的分号去掉
如果不启用的话,在上传的时候,就是这样的界面
如果,我们打开之后,不确定模块开启了,那我们就在根目录下面,放一个phpinfo.php的根目录文件
其实就是个phpinfo的函数,我们通过浏览器访问
这个时候,我们就可以看到phpinfo里面所有的配置文件
我们ctrl+f,网页搜一下exif
如果开启了,我们就会搜到这段话,用我们这个环境就没有问题了
第十五关,这一关是图片马的上传操作,具体操作可以去看第十四关的操作
我们来讲一下后台的代码
这一串代码跟前面两关的代码,主体没有什么变化
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$temp_file = $_FILES['upload_file']['tmp_name'];
$res = isImage($temp_file);
会先去获取临时文件,然后去判断这临时文件是否是img,调用函数isImage,然后代码会调用到第六行,然后去执行这串代码
$image_type = exif_imagetype($filename);
exif_imagetype用来获取文件的类型,返回image_type,整型的数字,通过这个数字,来判断文件到底是什么类型
它的返回内容有16个,根据返回的值,来判断我们图片类型是什么
switch ($image_type) {
case IMAGETYPE_GIF:
return "gif";
break;
case IMAGETYPE_JPEG:
return "jpg";
break;
case IMAGETYPE_PNG:
return "png";
break;
default:
return false;
break;
}
因为是数字,所以我们用switch来做判断,如果对的话,就return文件类型,如果不对,就return false
if(!$res == false){
$msg = "文件未知,上传失败!";
如果说res ==false,那就会提示我们文件未知,上传失败,
$img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$res;
if(move_uploaded_file($temp_file,$img_path)){
$is_upload = true;
如果文件类型没有问题,那就会生成图片路径,将图片拷贝到新的上传路径里面去,标记上传成功,最终返回
switch,里面的break写的就没有什么意义,因为return之后,整个代码就结束了,所以说,break永远执行不到
通过这三篇文章,大家会总结到图片马后台的一个校验方式,这对大家后面的渗透测试是有帮助的