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. виндовая совместимость не требуется

★★★★

А с 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 ★★ ()