Безопасный способ проверки расширения файла в сериализаторе Django
Я создал приложение, в котором я могу хранить изображения продуктов. В базе данных я храню только направления на изображения, которые хранятся в указанной папке. В моем сериализаторе мне нужно проверить имена файлов и проверить, являются ли эти расширения расширениями фотографий. Я написал что-то вроде этого ниже, является ли это лучшим способом проверки? Может быть, есть более безопасный метод?
ALLOWED_IMAGE_EXTENSIONS = ["png", "jpg", "jpeg", "bmp", "gif"]
class ProductImageSerializer(serializers.ModelSerializer):
class Meta:
model = ProductImage
fields = [...]
class ProductSerializer(serializers.ModelSerializer):
images = ProductImageSerializer(many=True, read_only=True)
class Meta:
model = Product
fields = [..., 'images']
def create(self, validated_data):
...
for file in self.context['request'].FILES.getlist('images'):
validate_extension(file.name)
...
return item
def validate_extension(filename):
extension = os.path.splitext(filename)[1].replace(".", "")
if extension.lower() not in ALLOWED_IMAGE_EXTENSIONS:
raise serializers.ValidationError(
(f'Invalid uploaded file type: {filename}'),
code='invalid',
)
Можно добавить еще две проверки. Во-первых, вы можете проверить тип mime файла, например, используя пакет python-magic
в linux (python-magic-bin
для windows). Также вы можете сравнить размер файла с желаемым максимальным размером файла в вашем проекте.