Простой Python. современный стиль программирования - читать онлайн бесплатно полную версию книги . Страница 174

>>> text = fin.read()

>>> 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)