Безопасный способ проверки расширения файла в сериализаторе Django

#django #image #django-rest-framework

Вопрос:

Я создал приложение, в котором могу хранить изображения продуктов. В базе данных я храню только указания к изображениям, которые хранятся в указанной папке. В моем сериализаторе мне нужно проверить имена файлов и проверить, являются ли расширения расширениями для фотографий. Я написал что-то подобное ниже, это лучший способ проверить это? Может быть, есть более безопасный метод?

 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',
        )
 

Ответ №1:

Вы можете добавить еще 2 проверки. Во-первых, вы можете проверить тип mime файла, например, с помощью python-magic пакета в Linux ( python-magic-bin для Windows). Кроме того, вы можете сравнить размер файла с желаемым максимальным размером файла в вашем проекте.