DEV Community на русском
Подписаться
Загрузка удалась, рекорд — нет
Автор разработал систему загрузки на YouTube с последовательным процессом, включающим инициализацию сессии, передачу файла, получение идентификатора видео, проверку и создание локальной записи. Возникла критическая уязвимость, поскольку локальная запись записывалась только после этапа проверки. Если проверка не удавалась, исключение останавливало процесс, не оставляя на диске записи о загруженном видео. Следовательно, повторный запуск команды загрузки обходил проверку существующего файла, что приводило к дублированию загруженных видео.Документация системы ошибочно утверждала, что повторные попытки не приведут к дублированию, но это относилось только к внутренним низкоуровневым повторным попыткам, а не к внешним повторным запускам всего процесса после сбоя. Это привело к двукратной загрузке одного и того же видео. Аналогичная ошибка была обнаружена в другой части репозитория, где пять видео, загруженных по старой схеме, также не имели соответствующих локальных записей, что делало их уязвимыми для дублирования.Автор подчеркивает, что существующие тесты проходили, поскольку они не учитывали состояние системы на диске после возникновения исключения. Исправление заключалось в изменении рабочего процесса, чтобы записывать локальную запись сразу после получения идентификатора видео, даже если он был помечен как непроверенный. Эта запись затем позволяла либо возобновить проверку, либо заблокировать дальнейшие загрузки, если видео уже было обработано. Для пяти ранее существовавших видео потребовалось ручное восстановление их записей.Основная проблема обобщается на любую операцию, которая создает удаленный ресурс, а затем проверяет его, создавая окно, в котором сбой может привести к тому, что удаленный ресурс будет создан, а локальное состояние не будет записано. Эта неоднозначность делает логику повторных попыток неэффективной. Решение подчеркивает необходимость записи идентификатора в момент его получения, независимо от последующей проверки. Оно также подчеркивает, что все пути кода, создающие ресурс, должны вносить вклад в одну и ту же систему учета, чтобы предотвратить невидимые несоответствия.