利用 PHP POST 临时文件机制实现任意文件上传
PHP的POST请求在处理文件上传时,会将上传的文件临时存储在服务器上。攻击者可以利用这一机制,绕过服务器对上传文件的类型、大小等限制,从而实现任意文件上传。
$_FILES
数组,可以获取到上传文件的临时文件名。finfo_file()
函数或mime_content_type()
函数对上传文件的类型进行严格验证。
<?php
// 上传文件处理
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolow er(pathinfo($target_file,PATHINFO_EXTENSION));
// 检查文件是否为图片
$check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
if($check !== false) {
echo "文件是图片 - " . $check["mime"] . ".";
$uploadOk = 1;
} else {
echo "文件不是图片。";
$uploadOk = 0;
}
// 检查文件是否已经存在
if (file_exists($target_file)) {
echo "抱歉,文件已经存在。";
$uploadOk = 0;
}
// 检查文件大小
if ($_FILES["fileToUpload"]["size"] > 500000) {
echo "抱歉,您的文件太大。";
$uploadOk = 0;
}
// 允许上传的格式
$allowed_types = array("jpg", "jpeg", "png", "gif");
if(!in_array($imageFileType, $allowed_types)) {
echo "抱歉,只允许上传 JPG, JPEG, PNG & GIF 格式。";
$uploadOk = 0;
}
// 如果 $uploadOk 为 0,则上传失败
if ($uploadOk == 0) {
echo "抱歉,您的文件未上传。";
// 如果一切顺利,则尝试将文件移动到新位置
} else {
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
echo "文件上传成功";
} else {
echo "抱歉,上传文件出错。";
}
}
}
PHP POST临时文件机制虽然方便,但如果处理不当,很容易被攻击者利用。开发者必须采取严格的安全措施,才能有效防止任意文件上传攻击。
建议:
免责声明: 本文仅用于技术交流和学习,请勿用于非法用途。