>>> data = yaml.load(text)
>>> data['details']
{'themes': ['cheese', 'Canada'], 'bearded': True}
>>> len(data['poems'])
2
Создаваемые структуры данных совпадают со структурами YAML-файла, ко-
торые в данном случае имеют глубину более одного уровня. Вы можете получить
заголовок второго стихотворения с помощью следующей ссылки:
>>> data['poems'][1]['title']
'Canadian Charms'
PyYAML может загружать объекты Python из строк, и это опасно. Используйте метод safe_
load() вместо метода load(), если импортируете данные в формате YAML, которым не дове-
ряете. А лучше всегда используйте метод safe_load(). Прочтите статью War is peace (http://
nedbatchelder.com/blog/201302/war_is_peace.html), чтобы узнать о том, как незащищенная
загрузка YAML скомпрометировала платформу Ruby on Rails.
228
Глава 8. Данные должны куда-то попадать
Безопасность
Вы можете использовать любой формат, описанный в этой главе, для сохранения
объектов в файлы и их считывания. Однако существует вероятность внедриться
в этот процесс и вызвать проблемы с безопасностью.
Например, в следующем фрагменте XML-файла, состоящем из миллиарда
усмешек, страница «Википедии» определяет десять вложенных сущностей, каждая
из которых распространяется на более низкий уровень десять раз, порождая в сум-
ме один миллиард сущностей:
<?xml version="1.0"?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<lolz>&lol9;</lolz>
Плохая новость: миллиард усмешек подорвет работоспособность всех XML-
библиотек, упомянутых в предыдущем разделе. На ресурсе Defused XML (https://
bitbucket.org/tiran/defusedxml) эта и другие атаки перечислены наряду с уязвимостя-
ми библиотек Python. Перейдя по этой ссылке, вы увидите, как изменять настрой-
ки многих библиотек так, чтобы избежать этих проблем. Вы также можете исполь-
зовать библиотеку defusedxml как внешний интерфейс безопасности для других
библиотек:
>>> # insecure:
>>> from xml.etree.ElementTree import parse
>>> et = parse(xmlfile)