服务器只检查文件扩展名,可通过多种方式绕过
// ❌ 只检查最后的扩展名
const ext = filename.substring(filename.lastIndexOf('.'))
if (!ALLOWED_EXTENSIONS.includes(ext.toLowerCase())) {
return res.status(400).json({ error: '不允许的文件类型' })
}
// 问题:shell.php.jpg 的 ext 是 .jpg,通过检查!
// ✅ 检查所有扩展名
const parts = filename.split('.')
const dangerousExts = ['.php', '.jsp', '.asp', '.exe']
for (const part of parts) {
if (dangerousExts.some(e => e.includes(part.toLowerCase()))) {
return res.status(400).json({ error: '检测到危险扩展名' })
}
}