1、源码分析
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$ext_arr = array('jpg','png','gif');
$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
if(in_array($file_ext,$ext_arr)){
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
if(move_uploaded_file($temp_file,$img_path)){
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else{
$msg = "只允许上传.jpg|.png|.gif类型文件!";
}
}
添加注释解读:
$is_upload = false;
$msg = null;
# 检查是否有名为 submit 的表单提交
if(isset($_POST['submit'])){
# 包含允许上传的文件扩展名的数组即为白名单
$ext_arr = array('jpg','png','gif');
# 获取上传文件的扩展名
$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
# 检查上传文件的扩展名是否在允许的扩展名数组中
if(in_array($file_ext,$ext_arr)){
# 获取临时文件的路径
$temp_file = $_FILES['upload_file']['tmp_name'];
# 构建目标文件路径 $img_path,使用 rand(10, 99) 生成两位随机数和当前日期时间
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
# 使用 move_uploaded_file($temp_file, $img_path) 将上传的文件移动到目标路径
if(move_uploaded_file($temp_file,$img_path)){
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else{
$msg = "只允许上传.jpg|.png|.gif类型文件!";
}
}
代码中使用白名单限制上传的文件后缀名,只允许指定的图片格式。但是$_GET['save_path']
服务器接受客户端的值,这个值可被客户端修改。
2、%00截断GET上传
这里我们便将上传参数更改:
更改掉之后就会将1.jpg覆盖给1.php通过%00进行截断,即为1.php%001.jpg变为1.php:
然后访问执行即可。