🗣 Wd提问: php 文件上传 禁止上传 htm
🤖 Ai回答: 在 PHP 中,为了防止用户上传恶意的 `.htm` 或 `.html` 文件(可能包含 XSS 攻击或执行脚本),你可以通过以下方式来禁止上传 `.htm` 和 `.html` 文件。
✅ 方法一:检查文件扩展名(推荐)
php
<?php
if ($_FILES['file']['error'] == 0) {
$filename = $_FILES['file']['name'];
$filetype = $_FILES['file']['type'];
$filesize = $_FILES['file']['size'];
$tmp_name = $_FILES['file']['tmp_name'];
// 获取文件扩展名
$ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
// 定义允许的文件类型(例如:jpg, png, pdf, docx 等)
$allowed_extensions = ['jpg', 'jpeg', 'png', 'gif', 'pdf', 'doc', 'docx', 'txt', 'zip'];
// 检查是否为不允许的扩展名(如 htm, html)
if (in_array($ext, ['htm', 'html'])) {
die(不允许上传 HTML 类型文件!);
}
// 进一步验证是否在允许列表中
if (!in_array($ext, $allowed_extensions)) {
die(文件类型不被允许!);
}
// 可选:检查 MIME 类型(更安全)
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime_type = finfo_file($finfo, $tmp_name);
finfo_close($finfo);
if ($mime_type === 'text/html') {
die(检测到 HTML 内容,上传被拒绝!);
}
// 如果一切正常,移动文件
$upload_dir = 'uploads/';
$new_filename = uniqid() 、'.' 、$ext;
move_uploaded_file($tmp_name, $upload_dir 、$new_filename);
echo 文件上传成功!;
}
?
✅ 方法二:使用 `$_FILES` + 验证逻辑(增强安全性)
php
<?php
$allowed_types = [
'image/jpeg',
'image/png',
'image/gif',
'application/pdf',
'application/msword',
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'text/plain',
'application/zip'
];
// 允许的扩展名(用于双重验证)
$allowed_exts = ['jpg', 'jpeg', 'png', 'gif', 'pdf', 'doc', 'docx', 'txt', 'zip'];
if (isset($_FILES['file']) && $_FILES['file']['error'] == 0) {
$file = $_FILES['file'];
$filename = $file['name'];
$tmp_name = $file['tmp_name'];
$mime_type = $file['type'];
$ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
// 检查扩展名是否为 htm 或 html
if (in_array($ext, ['htm', 'html'])) {
die(禁止上传 HTML 文件。);
}
// 检查 MIME 类型是否是文本或 HTML 类型
if (strpos($mime_type, 'text/') !== false $mime_type === 'text/html' $mime_type === 'application/xhtml+xml') {
die(不允许上传文本或 HTML 文件。);
}
// 检查是否在允许的 MIME 类型和扩展名中
if (!in_array($mime_type, $allowed_types) !in_array($ext, $allowed_exts)) {
die(文件类型不被允许。);
}
// 上传文件
$upload_path = 'uploads/' 、uniqid() 、'.' 、$ext;
if (move_uploaded_file($tmp_name, $upload_path)) {
echo 上传成功:$upload_path;
} else {
echo 上传失败。;
}
}
?
🔐 安全建议
1、不要仅依赖 `$_FILES['type']` —— 它可以被伪造。
2、使用 `finfo_open()` 来检测真实 MIME 类型。
3、不要直接信任文件名或扩展名,应结合内容检查。
4、上传后重命名文件,避免路径遍历攻击。
5、设置上传目录不可执行(`chmod 755`,并禁用 PHP 执行)。
6、在服务器上设置 `.htaccess` 或 Nginx 规则禁止执行上传文件:
apache
.htaccess 示例
<FilesMatch \.(html|htm)$
Order allow,deny
Deny from all
</FilesMatch
🧩 总结
✅ 禁止上传 `.htm` / `.html` 文件的方法:
检查文件扩展名(`pathinfo()`)
检查 MIME 类型(`finfo` 或 `$_FILES['type']`)
禁止上传后处理为可执行文件
配合服务器配置加强安全
如果你需要支持更多文件类型或有特殊需求(如白名单机制),也可以进一步定制。需要我帮你生成完整的上传表单+处理代码吗?
📣 商家广告:





0
IP地址: 204.213.196.89
搜索次数: 4
提问时间: 2025-11-27 02:21:31
本站所有
❓
问答
均由Ai自动分析整理,内容仅供参考,若有误差请用“联系”里面信息通知我们人工修改或删除。
本站由
🟢
豌豆Ai
提供技术支持,使用的最新版:
豌豆Ai站群搜索引擎系统 V.25.10.25
搭建本站。