PHP上传文件时,识别伪装。
我们在编写php文件上传的时候,可能会忽略了对上传文件进行验证,下面我们来进行关于:文件上传时验证上传的文件是否合法的问题。
一,简单的测试,将txt后缀的文件改成jpg;并进行上传。
二,修改完后进行简单的测试:
(1)通过$_FILES [‘user’] [‘type’] ;获取文件后缀名;
<!DOCTYPE html>
<html>
<meta charset="utf-8">
<body>
<h2>文件上传伪装测试</h2>
<form method="post" action="" enctype="multipart/form-data">
选择文件:
<input type="file" name="userfile" />
<input type="submit" value="提交" />
</form>
</body>
<?php
$data=$_FILES['userfile'];
var_dump($data);
?>
</html>
我们提交完之后可以发现,并没有检测出来:
返回:
array(5) { ["name"]=> string(8) "test.png"
["type"]=> string(9) "image/png"
["tmp_name"]=> string(22) "C:\Windows\phpBE13.tmp"
["error"]=> int(0)
["size"]=> int(10) }
(2)用pathinfo()函数来获取文件路径:
<!DOCTYPE html>
<html>
<meta charset="utf-8">
<body>
<h2>文件上传伪装测试</h2>
<form method="post" action="" enctype="multipart/form-data">
选择文件:
<input type="file" name="userfile" />
<input type="submit" name="button" value="提交" />
</form>
</body>
<?php
$data = $_FILES['userfile'];
var_dump(pathinfo($data['name']));
?>
</html>
返回:
array(4) { ["dirname"]=> string(1) "." ["basename"]=> string(8) "test.png" ["extension"]=> string(3) "png" ["filename"]=> string(4) "test" }
仍然认为我们的文件是png文件,没有检测出来。
(3)用php的拓展,fileinfo来判断。
<!DOCTYPE html>
<html>
<meta charset="utf-8">
<body>
<h2>文件上传伪装测试</h2>
<form method="post" action="" enctype="multipart/form-data">
选择文件:
<input type="file" name="userfile" />
<input type="submit" value="提交" />
</form>
</body>
<?php
$data = $_FILES['userfile'];
$filename = $data['tmp_name'];
$fileinfo = finfo_open(FILEINFO_MIME_TYPE);
$mimetype = finfo_file($fileinfo, $filename);
finfo_close($fileinfo);
var_dump($mimetype);
?>
</html>
上传后,返回如下:判断为text文件:
判断成功,可以识别伪装文件。
三,附上完整的识别文件伪装代码:
<!DOCTYPE html>
<html>
<meta charset="utf-8">
<body>
<h2>文件上传伪装测试</h2>
<form method="post" action="" enctype="multipart/form-data">
选择文件:
<input type="file" name="userfile" />
<input type="submit" name="button" value="提交" />
</form>
</body>
<?php
if(!empty($_POST)){
$fileinfo = finfo_open(FILEINFO_MIME_TYPE); //创建info资源
$mimetype = finfo_file($fileinfo, $_FILES['userfile']['tmp_name']); //与finfo资源和文件做比较
finfo_close($fileinfo);
$pass = array('image/png', 'image/jpeg', 'image/gif'); //允许通过类别
echo in_array($mimetype, $pass)?'合法':'非法';
}
?>
</html>
last: thank u for watching!!!