🗣 Wd提问: php 文件上传 禁止上传 php
🤖 Ai回答: 在 PHP 中,为了防止用户上传恶意的 `.php` 文件(例如 Web Shell),你需要在文件上传时进行严格的检查和限制。以下是几种有效的措施来 禁止上传 PHP 文件:
✅ 1、检查文件扩展名
php
$allowed_extensions = ['jpg', 'jpeg', 'png', 'gif', 'pdf', 'txt']; // 允许的文件类型
$file_extension = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION));
if (!in_array($file_extension, $allowed_extensions)) {
die('不允许的文件类型!');
}
⚠️ 注意:不能仅依赖 `$_FILES['name']` 的扩展名,因为可以被伪造。
✅ 2、使用 `mime_type` 检查(更安全)
php
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime_type = finfo_file($finfo, $_FILES['file']['tmp_name']);
finfo_close($finfo);
$allowed_mime_types = [
'image/jpeg',
'image/png',
'image/gif',
'application/pdf',
'text/plain'
];
if (!in_array($mime_type, $allowed_mime_types)) {
die('文件类型不合法!');
}
✅ 3、检查文件内容(防止伪装成图片的 PHP 脚本)
php
$content = file_get_contents($_FILES['file']['tmp_name']);
// 如果是 PHP 文件,会包含 <?php 或 <script 等标签
if (preg_match('/<\?php|\bphp\b|<script/', $content)) {
die('文件包含非法代码!');
}
🛠️ 这种方式可以识别出伪装成图片但实际是 PHP 的文件(如 `<?php system($_GET['cmd']); ?` 写入到图片中)。
✅ 4、重命名上传文件,避免执行
php
$original_name = $_FILES['file']['name'];
$filename = uniqid() 、'_' 、basename($original_name);
$upload_dir = 'uploads/';
$destination = $upload_dir 、$filename;
move_uploaded_file($_FILES['file']['tmp_name'], $destination);
❌ 不要使用原文件名,尤其是带有 `.php` 后缀的。
✅ 5、设置目录权限,禁用脚本执行
确保上传目录没有执行权限(Apache/Nginx 配置):
apache
.htaccess
<FilesMatch \.(php|phtml|php3|php4)$
Order Allow,Deny
Deny from all
</FilesMatch
或在 Nginx 中:
nginx
location ~* \.(php|phtml)$ {
deny all;
}
✅ 6、完整示例代码
php
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$allowed_extensions = ['jpg', 'jpeg', 'png', 'gif', 'pdf', 'txt'];
$allowed_mime_types = [
'image/jpeg',
'image/png',
'image/gif',
'application/pdf',
'text/plain'
];
$file = $_FILES['file'];
// 检查是否上传成功
if ($file['error'] !== UPLOAD_ERR_OK) {
die('上传失败!');
}
// 检查扩展名
$extension = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
if (!in_array($extension, $allowed_extensions)) {
die('不允许的文件类型!');
}
// 检查 MIME 类型
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime_type = finfo_file($finfo, $file['tmp_name']);
finfo_close($finfo);
if (!in_array($mime_type, $allowed_mime_types)) {
die('文件类型不合法!');
}
// 检查文件内容(防止恶意代码)
$content = file_get_contents($file['tmp_name']);
if (preg_match('/<\?php|\bphp\b|<script/', $content)) {
die('文件包含非法代码!');
}
// 生成安全文件名
$safe_filename = uniqid() 、'_' 、basename($file['name']);
$upload_dir = 'uploads/';
if (!is_dir($upload_dir)) mkdir($upload_dir, 0755, true);
$destination = $upload_dir 、$safe_filename;
if (move_uploaded_file($file['tmp_name'], $destination)) {
echo 上传成功!;
} else {
echo 移动文件失败!;
}
}
?
🔐 总结:如何彻底禁止上传 PHP 文件?
| 措施 | 是否必要 |
| 检查文件扩展名 | ✅ 基础防护 |
| 检查 MIME 类型 | ✅ 更安全 |
| 检查文件内容 | ✅ 防止伪装 |
| 重命名文件 | ✅ 防止执行 |
| 服务器配置禁止执行 PHP | ✅ 必须 |
💡 最佳实践建议:
不要信任用户上传的文件名
不要将上传文件放在可执行目录
定期扫描上传目录
使用白名单机制而非黑名单
如有需要,也可以使用第三方库如 [Intervention Image](https://image.intervention.io/) 来验证图片真实性。
如果你使用的是 Laravel、Symfony 等框架,它们也提供了更完善的上传验证机制。
📣 商家广告:





0
IP地址: 231.142.18.173
搜索次数: 0
提问时间: 2025-11-08 11:37:37
🛒 域名购买:
08.gold
671.net.cn
gzzc.net
afuncard.com
zhanwai.cn
691.net.cn
ndgj.cn
887.net.cn
yk.gs
zhong.tw
❓️ 热门提问:
蜘蛛池MySQL流量统计
建设机房工程
idc公司租用服务器
电脑主机启动声音很大
cdn 加速乐
vps信用卡
idc机房拓扑图
怎么打开电脑服务器
域名怎么卖的
网站空间香港主机
豌豆Ai站群搜索引擎系统
🌐 域名评估:
bu.cx
u.fj.cn
emojiall.com
trump.bj.cn
nxiw.cn
vtolfair.cn
si.yn.cn
hecq.cn
vtol.nm.cn
lmjcy.com
⛏ 最新挖掘:
凯里酸汤鱼
贵阳烤脑花
都匀毛尖茶
花溪牛肉粉
贵阳烤生蚝
贵阳烤豆腐
贵阳纸包鱼
贵阳特色菜
🖌 热门作画:
🤝 关于我们:
豌豆Ai
域名
建站
站群
留痕
推广
评估
源码
开发Ai
工具
日记
价格
加盟
广告
流量
留言
联系
🗨 加入群聊:
🔗 友情链接:
贵阳洁净车间
google优化公司
ai提问
🧰 站长工具:
Ai工具 whois查询 搜索
📢 温馨提示:本站所有问答由Ai自动创作,内容仅供参考,若有误差请用“联系”里面信息通知我们人工修改或删除。
👉 技术支持:本站由豌豆Ai提供技术支持,使用的最新版:《豌豆Ai站群搜索引擎系统 V.25.10.25》搭建本站。