477просмотров
23 сентября 2025 г.
Score: 525
Опасные места в YAML YAML позиционируется как человекочитаемый формат данных, но при этом это склад подводных камней. Рассмотрим самые тупые особенности, которые могут привести к неожиданным ошибкам. Шестидесятеричные числа port_mapping: - 22:22 - 80:80 - 443:443 Что вы ожидаете увидеть? Скорее всего, список строк для настройки портов. Но YAML 1.1 интерпретирует 22:22 как шестидесятеричное число и превращает его в 1342. В YAML 1.2 эту "фичу" убрали, но многие парсеры до сих пор используют старую версию. Проблема Норвегии countries: - dk - fi - is - no - se Код страны Норвегии no будет интерпретирован как булево значение false. То же самое произойдет с off, n, yes, on, y в различных вариантах написания. Классическая ловушка, получившая название "Norway Problem". Случайные числа versions: - 9.5.25 # строка - 9.6.24 # строка - 10.23 # Число! - 12.13 # Тоже число! Строки без кавычек могут неожиданно стать числами. 10.23 превратится в float, а 9.5.25 останется строкой, потому что имеет "слишком много" точек. Ключи не только строки settings: on: [push, deploy] priority: high Здесь on интерпретируется как булево true, поэтому ключом становится не строка "on", а логическое значение. В JSON это может превратиться в "True" или вызвать ошибку. Теги и небезопасность user_data: !python/object/apply:subprocess.check_output [['rm', '-rf', '/']] Теги, говорят, иногда полезны, но при определенных условиях позволяют выполнять произвольный код при загрузке. Всегда используйте safe_load вместо load в Python и аналогичные безопасные методы в других языках.