本文目录导读:

在PHP中限制上传文件类型有多种方法,以下是几种常用的实现方式:
使用文件扩展名验证(基础方法)
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$allowed_extensions = ['jpg', 'jpeg', 'png', 'gif'];
$file_extension = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION));
if (!in_array($file_extension, $allowed_extensions)) {
die('文件类型不允许上传');
}
// 上传文件
move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . $_FILES['file']['name']);
}
?>
使用MIME类型验证(更安全)
<?php
$allowed_mime_types = [
'image/jpeg',
'image/png',
'image/gif',
'application/pdf'
];
// 检查文件MIME类型
$file_mime = mime_content_type($_FILES['file']['tmp_name']);
$uploaded_mime = $_FILES['file']['type'];
if (!in_array($file_mime, $allowed_mime_types)) {
die('文件MIME类型不允许');
}
?>
图片文件额外验证(最可靠)
<?php
$allowed_mime_types = ['image/jpeg', 'image/png', 'image/gif'];
$file_mime = mime_content_type($_FILES['file']['tmp_name']);
// 检查是否为真实图片
$image_info = getimagesize($_FILES['file']['tmp_name']);
if ($image_info === false) {
die('文件不是有效的图片');
}
if (!in_array($image_info['mime'], $allowed_mime_types)) {
die('图片类型不允许');
}
?>
完整的文件上传类
<?php
class FileUploader {
private $allowed_extensions;
private $allowed_mime_types;
private $max_size;
public function __construct() {
$this->allowed_extensions = ['jpg', 'jpeg', 'png', 'gif'];
$this->allowed_mime_types = ['image/jpeg', 'image/png', 'image/gif'];
$this->max_size = 5 * 1024 * 1024; // 5MB
}
public function upload($file, $upload_dir) {
// 检查上传错误
if ($file['error'] !== UPLOAD_ERR_OK) {
return ['success' => false, 'message' => '上传错误'];
}
// 检查文件大小
if ($file['size'] > $this->max_size) {
return ['success' => false, 'message' => '文件过大'];
}
// 检查扩展名
$extension = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
if (!in_array($extension, $this->allowed_extensions)) {
return ['success' => false, 'message' => '文件类型不允许'];
}
// 检查MIME类型(使用mime_content_type更可靠)
$mime = mime_content_type($file['tmp_name']);
if (!in_array($mime, $this->allowed_mime_types)) {
return ['success' => false, 'message' => 'MIME类型不允许'];
}
// 生成唯一文件名
$newname = uniqid() . '.' . $extension;
// 移动文件
if (!move_uploaded_file($file['tmp_name'], $upload_dir . '/' . $newname)) {
return ['success' => false, 'message' => '文件保存失败'];
}
return ['success' => true, 'filename' => $newname];
}
}
// 使用示例
$uploader = new FileUploader();
$result = $uploader->upload($_FILES['file'], 'uploads');
if ($result['success']) {
echo '上传成功!文件名:' . $result['filename'];
} else {
echo '上传失败:' . $result['message'];
}
?>
HTML表单示例
<form action="upload.php" method="post" enctype="multipart/form-data">
<!-- 添加客户端验证 -->
<input type="file" name="file" accept=".jpg,.jpeg,.png,.gif,image/jpeg,image/png,image/gif">
<input type="submit" value="上传">
</form>
重要安全提示
- 不要仅依赖客户端验证:客户端验证可以被绕过,必须在服务器端进行验证
- 不要信任
$_FILES['file']['type']:这个值可以由客户端伪造,应该使用mime_content_type()函数 - 对图片文件使用
getimagesize():额外验证是否为真实图片 - 重命名文件:使用唯一名称保存文件,避免路径穿越
- 限制文件大小:同时设置
upload_max_filesize和post_max_size - 存储目录权限:确保上传目录没有执行权限
配置文件设置(php.ini)
upload_max_filesize = 5M
post_max_size = 6M
max_file_uploads = 20
通过组合使用这些方法,可以有效限制上传文件类型,提高网站安全性。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播