豌豆Ai站群搜索引擎系统 V.25.10.25 网址:www.wd.chat

🗣 Wd提问: php 文件上传 白名单

🤖 Ai回答:
在 PHP 中进行文件上传时,为了防止恶意文件(如 `.php`、`.exe` 等可执行文件)被上传到服务器,通常会使用“白名单”机制来限制允许上传的文件类型。以下是实现文件上传白名单的完整示例和最佳实践。

✅ 一、什么是文件上传白名单?

白名单(Whitelist)是指只允许特定类型的文件上传,例如:`.jpg`, `.png`, `.pdf` 等。
与之相对的是“黑名单”(Blacklist),即禁止某些类型。白名单更安全,因为黑名单容易被绕过。

✅ 二、基本代码示例(使用白名单)

php
<?php
// 配置允许上传的文件类型(白名单)
$allowedTypes = [
'image/jpeg',
'image/jpg',
'image/png',
'image/gif',
'application/pdf',
'text/plain'
];

// 检查是否是通过 POST 上传
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
die('Invalid request method');
}

// 检查是否有文件上传
if (!isset($_FILES['upload_file']) $_FILES['upload_file']['error'] !== UPLOAD_ERR_OK) {
die('File upload failed: ' 、$_FILES['upload_file']['error']);
}

$file = $_FILES['upload_file'];

// 1、检查文件类型(MIME 类型)
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimeType = finfo_file($finfo, $file['tmp_name']);
finfo_close($finfo);

if (!in_array($mimeType, $allowedTypes)) {
die('Invalid file type: ' 、$mimeType);
}

// 2、检查文件扩展名(双重验证)
$extension = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
$allowedExtensions = ['jpg', 'jpeg', 'png', 'gif', 'pdf', 'txt'];

if (!in_array($extension, $allowedExtensions)) {
die('Invalid file extension: ' 、$extension);
}

// 3、安全重命名文件(避免路径遍历或覆盖风险)
$fileName = uniqid() 、'.' 、$extension;
$uploadDir = 'uploads/';
$uploadPath = $uploadDir 、$fileName;

// 确保上传目录存在
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0755, true);
}

// 4、移动文件到目标目录
if (move_uploaded_file($file['tmp_name'], $uploadPath)) {
echo File uploaded successfully: $fileName;
} else {
die('Failed to move uploaded file.');
}
?

✅ 三、关键安全点说明

| 安全措施 | 说明 |

| ✅ 使用白名单(而非黑名单) | 只允许已知安全的类型 |
| ✅ 检查 `MIME` 类型 | 使用 `finfo_file()` 验证真实类型,避免伪造 |
| ✅ 检查文件扩展名 | 防止伪装(如 `.php.jpg`) |
| ✅ 重命名文件 | 使用 `uniqid()` 避免文件名冲突和攻击 |
| ✅ 上传目录权限设置 | 上传目录应无执行权限(如禁用 PHP 执行) |
| ✅ 限制文件大小 | 通过 `upload_max_filesize` 和 `post_max_size` 限制 |

✅ 四、配置 php.ini(推荐)

确保 `php.ini` 设置合理:

ini
upload_max_filesize = 10M
post_max_size = 10M
file_uploads = On

⚠️ 建议将上传目录设为 不可执行脚本,例如:

Apache:在 `.htaccess` 添加 `php_flag engine off`
Nginx:在配置中禁止执行 `*.php`(如果目录中有)
或者直接把上传目录放在 web 根目录外

✅ 五、额外建议

使用 `exif_imagetype()` 检查图片真实性(防恶意图片)
限制用户上传频率(防洪水攻击)
记录日志(上传时间、用户、文件名等)
对于敏感系统,考虑使用 CDN + 服务端签名上传

✅ 六、常见错误与防范

| 错误 | 如何防范 |

| 仅检查扩展名 | 必须结合 MIME 检查 |
| 未重命名文件 | 易被覆盖或利用路径遍历 |
| 上传目录可执行 | 导致 `.php` 文件被执行 |
| 未检查文件大小 | 可能导致拒绝服务(DoS) |

✅ 总结

✅ 推荐做法:

php
1、白名单(允许的 MIME + 扩展名)
2、使用 `finfo_file()` 检查真实类型
3、重命名文件 + 安全存储路径
4、上传目录无执行权限
5、合理设置 PHP 配置

如果你希望我帮你生成一个完整的上传表单 + 处理脚本,也可以告诉我需求(比如支持图片/文档/视频等)。

Ai作答

📣 商家广告


取名

广东过滤器

店名

高防vps

广告招商


0

IP地址: 171.53.8.138

搜索次数: 0

提问时间: 2025-11-08 10:57:51

🛒 域名购买
kou.red
zhang.la
815.red
665.net.cn
kb.gs
cyrj.net
352.net.cn
wz.chat
3.hk.cn
671.net.cn

❓️ 热门提问
cn域名注册
购买新加坡服务器
SEO工具图片优化
MySQL xtrabackup
比较好的建筑网站设计
美国云服务器哪个好
服务器 代理
网店托管代运营网店
怎么租用gpu服务器
mysql数据库服务器安装
豌豆Ai站群搜索引擎系统

🌐 域名评估
robots.red
vivo.ln.cn
wq.gs
dji.zj.cn
hanshui.com
q-u.com.cn
khgr.cn
r.hk.cn
su.tw.cn
yu8.xj.cn

⛏ 最新挖掘
凯里酸汤鱼
贵阳烤脑花
都匀毛尖茶
花溪牛肉粉
贵阳烤生蚝
贵阳烤豆腐
贵阳纸包鱼
贵阳特色菜

🖌 热门作画

🤝 关于我们:
豌豆Ai 域名 建站 站群 留痕 推广 评估 源码
开发Ai 工具 日记 价格 加盟 广告 流量 留言 联系

🗨 加入群聊
群

🔗 友情链接
网站搭建培训  日本の検索エンジン  ai提问

🧰 站长工具
Ai工具  whois查询  搜索

📢 温馨提示:本站所有问答由Ai自动创作,内容仅供参考,若有误差请用“联系”里面信息通知我们人工修改或删除。

👉 技术支持:本站由豌豆Ai提供技术支持,使用的最新版:《豌豆Ai站群搜索引擎系统 V.25.10.25》搭建本站。

上一篇 79383 79384 79385 下一篇