针对文件上传漏洞,在使用中思考怎么进行反制,所以写了这些代码进行,尝试进行阻止,如果有绕过方式可以评论一下,我看能不能在完善一些
前端部分
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form action="inclu.php" method="post" enctype="multipart/form-data">
<span>上传文件</span><input type="file" name="file" id="file">
<input type="submit" value="上传" name="submit">
</form>
</body>
</html>
后端校验
<?php
$target = "/opt/lampp/htdocs/sefa15/tupian/"; //设定固定的存储路径
$target_log = $target . basename($_FILES["file"]["name"]); //对文件名进行拼接
// echo $_FILES["file"]["name"];//:客户端机器文件的原名称
// echo $target_log;
$imageFileType = strtolower(pathinfo($target_log,PATHINFO_EXTENSION)); //以小写形式,返回最后一个末尾值
$md5imageFileType=md5(strtolower(pathinfo($target_log,PATHINFO_FILENAME))); //md5形式重命名
// echo $md5imageFileType;
// echo $imageFileType;
$target_log=$target.$md5imageFileType.'.'.$imageFileType; //重新拼接
// echo $target_log;
// $check = getimagesize($_FILES["file"]);
$target_error=$_FILES['file']['error'];
if ($target_error != 0){
die ('上传文件不能为空');
}
$check = getimagesize($_FILES["file"]["tmp_name"]); //获取图像信息,临时名
// echo $check;
if($check !== false) {
echo "文件是图像".$check["mime"]; //返回图像mime格式
} else {
die ("文件不是图像");
}
if (file_exists($target_log)) { //检查图片是否存在
die ("对不起,该文件已经存在");
}
if ($_FILES["file"]["size"] > 1048576) {
die ("对不起,你的文件太大了"); //大于1兆图片不能进入
}
$suff=array("jpg","png","jpeg","gif");
if(in_array($imageFileType,$suff) ) { //判断后缀名是否在数组中
echo ' ';
}else{
die ("只允许上传 JPG、JPEG、PNG & GIF 格式的文件");
}
if($check["mime"]='image/jpeg'){
$newimg=imagecreatefromjpeg($_FILES["file"]["tmp_name"]); //获取上传图片url
imagejpeg($newimg,$target_log); //重新生成一张图片,上传
echo "文件 ". basename( $_FILES["file"]["name"]). " 已经被成功上传";
}
elseif($check["mime"]='image/png'){
$newimg=imagecreatefrompng($_FILES["file"]["tmp_name"]);
imagepng($newimg,$target_log);
echo "文件 ". basename( $_FILES["file"]["name"]). " 已经被成功上传";
}
elseif($check["mime"]='image/gif'){
$newimg=imagecreatefromgif($_FILES["file"]["tmp_name"]);
imagegif($newimg,$target_log);
echo "文件 ". basename( $_FILES["file"]["name"]). " 已经被成功上传";
}
imagedestroy($newimg); //删除之前的临时变量
//通过重新生成图片,防御一句话木马
?>