LINUX.ORG.RU

Загрузка файлов на сервер

 , ,


1

0

Есть функция, которая сохраняет файл. С файловым именем практически никаких манипуляций не производилось. Мне нужно знать с какими символами могут вылезти подводные камни. Подскажите?
Вот собственно функция:

class UploadView(APIView):
    permission_classes = (IsAuthenticated,)
    parser_classes = (MultiPartParser, FormParser,)

    def post(self, request, format=None):
        book = request.FILES['file']

        directory = os.path.join(settings.MEDIA_ROOT, 'books')
        os.makedirs(directory, exist_ok=True)

        filename = str(book)
        files = [f for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f))]

        i = 2
        while True:
            if filename in files:
                p = str(book).rpartition('.')
                filename = '{}_{}.{}'.format(p[0], i, p[2])
                i += 1
            else:
                break

        filename = os.path.join(directory, filename)
        with open(filename, 'wb+') as file:
            for chunk in book:
                file.write(chunk)
        return Response(status=status.HTTP_201_CREATED)
p.s. виндовая совместимость не требуется

★★★★

Последнее исправление: FIL (всего исправлений: 4)

Вообще не используй имя загружаемого файла в реальной файловой системе, например.

anonymous
()

А с filename = '../../../../../etc/passwd' этот код как себя вести будет? Пример, конечно, вырожденный, но Вам лучше знать структуру каталогов Вашего приложения и что там лучше перезаписать, чтобы взломать сайт.

anonymous
()
Ответ на: комментарий от anonymous

Ну, passwd то не перезапишет, доступа ж нет. Но потенциальная дыра, да.
Достаточно ли будет убрать слеши из имени? Хочется красивые имена в ФС.

FIL ★★★★
() автор топика
Ответ на: комментарий от FIL

Недостаточно.

Вектор атаки может быть нацелен не только на непосредственное получение или перезапись некоторого файла, но и на некоторое ПО установленное на Вашем железе.

Еще пять минут гугления и мне попалась вот такая статья http://www.securityweek.com/wordpress-flaw-allows-xss-attack-image-filenames

Еще по поводу слэшей https://en.wikipedia.org/wiki/Directory_traversal_attack

Так что главный принцип — что все данные от пользователя должны фильтроваться никто не отменял.

Jaberwock ★★★
()

Не проще ли сохранять файл в базу данных ? С безопасностью все гораздо лучше

ism ★★★
()
Ответ на: комментарий от FIL

Если не требуется обеспечить сохранность оригинального имени, я генерирую хэш из имени файла.

gruy ★★★★★
()
Ответ на: комментарий от gruy

Как раз таки хотелось оригинальное имя.

FIL ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.