thinkphp 默认上传策略允许任意后缀是因为其内置的 upload 驱动在初始化时,若未显式配置 exts 参数,则默认不限制文件扩展名。要配置允许的扩展名,需在实例化 upload 对象时传入包含 exts 键的数组配置项,该值应为字符串数组或逗号分隔的字符串。

如何配置 exts 以限制特定后缀?
通过向 Upload 构造函数传递配置数组,可以明确指定允许的扩展名列表。例如,仅允许 jpg、png 和 gif 格式的图片文件。配置生效后,上传非白名单内的文件将直接抛出异常或被拒绝。

$upload = new \think\file\driver\Upload([
'exts' => ['jpg', 'png', 'gif'],
'maxSize' => 2097152,
'rootPath' => './uploads/'
]);
try {
$info = $upload->move('./uploads/avatar');
if ($info) {
echo "Success: " . $info->getSaveName();
}
} catch (\Exception $e) {
echo "Error: " . $e->getMessage();
}
上述代码中,exts 被设置为 ['jpg', 'png', 'gif']。当用户上传 test.php 时,系统会校验扩展名并拦截请求。预期结果为:合法图片上传成功,非法文件触发 FileExtNotAllow 异常。
exts 配置为空时会发生什么?
如果 exts 配置为空数组 [] 或未提供,ThinkPHP 的上传逻辑不会进行扩展名校验,从而允许任何后缀的文件上传。这种行为与默认行为一致,存在安全风险。开发者应始终显式设置 exts 以确保安全。

$upload = new \think\file\driver\Upload([
'exts' => [],
'maxSize' => 2097152,
'rootPath' => './uploads/'
]);
// 模拟上传一个恶意文件
$_FILES['file'] = [
'name' => 'malicious.php',
'type' => 'application/x-php',
'tmp_name' => '/tmp/phpXXXXXX',
'error' => 0,
'size' => 1024
];
try {
$info = $upload->move('./uploads/malicious');
if ($info) {
echo "Uploaded: " . $info->getFilename();
}
} catch (\Exception $e) {
echo "Blocked: " . $e->getMessage();
}
在此场景中,exts 为空,因此 malicious.php 会被接受。预期结果为:文件上传成功,文件名保留为 malicious.php。这验证了空配置等同于无限制。
基于 exts 配置的输入验证结果
当 exts 配置为 ['txt'] 时,上传 document.txt 将成功,而上传 script.js 将被拒绝。这体现了 exts 作为白名单机制的有效性。开发者应根据业务需求严格定义允许的后缀,避免使用通配符或留空。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











