Django文件上传处理机制踩坑记
最近在开发企业级Django应用时遇到了一个棘手的文件上传安全问题,特此记录。
问题背景
项目需要实现用户头像上传功能,最初使用了简单的FileField:
# models.py
from django.db import models
class UserProfile(models.Model):
avatar = models.FileField(upload_to='avatars/')
踩坑过程
- 文件类型验证缺失:直接使用FileField未做任何验证,导致用户可上传任意文件(包括恶意脚本)
- 路径遍历漏洞:未限制upload_to参数,可能导致文件写入到任意目录
- 文件大小限制缺失:未设置max_length等参数限制
解决方案
# models.py
from django.db import models
from django.core.exceptions import ValidationError
import os
def validate_file_extension(value):
ext = os.path.splitext(value.name)[1]
valid_extensions = ['.jpg', '.jpeg', '.png', '.gif']
if not ext.lower() in valid_extensions:
raise ValidationError('只允许上传JPG、PNG、GIF格式文件')
class UserProfile(models.Model):
avatar = models.FileField(
upload_to='avatars/',
validators=[validate_file_extension],
max_length=100
)
安全建议
- 使用白名单验证文件类型
- 限制文件大小
- 对上传路径进行安全检查
- 建议使用django-storages进行云存储集成

讨论