2016-05-25 3 views
0

Я храню шаблоны писем в PostgreSQL, чтобы пользователи могли редактировать исходящие письма. Я использую Liquid для предотвращения выполнения кода на сервере. Чтобы ускорить процесс извлечения шаблона электронной почты из db, разбора его, а затем его рендеринга, я хотел бы маршалировать жидкий шаблон. Вот код, чтобы сделать это:Вопросы безопасности с поддерживаемыми DB шаблонами Liquid и Marshal.load

# Saving template to the db 
text = "template text from possibly dangerous user {{stuff}}" 
template = Liquid::Template.parse(text) 
email_template = EmailTemplate.new # the db class 
email_template.source = Marshal.dump(template) 
email_template.save 

# time goes by and now we need that template 
template = Marshal.load(email_template.source) # !! Is this dangerous? !! 

Я прочитал, что Marshal.load может привести к удаленному выполнению кода. Я собираюсь маршалировать объект Liquid :: Template, но это содержит данные, предоставленные страшными пользователями. Есть ли какие-либо соображения безопасности, о которых мне нужно знать?

ответ

1

Теоретически там is проблема безопасности в вашей реализации.

От Ruby documentation:

По конструкции :: нагрузка может десериализации практически любого класса, загруженного в процесс Ruby. Во многих случаях это может привести к удаленному выполнению кода, если данные маршала загружаются из ненадежного источника.

В результате, загрузка не подходит в качестве сериализации общего назначения , и вы никогда не должны приводить в порядок входные данные пользователя или другие ненадежные данные.

Если вам нужно десериализация ненадежных данных, использовать JSON или другой сериализации формата, который только в состоянии загрузить просто, «примитивные» таких типов, как String, Array, Hash и т.д. Никогда не допускайте пользовательский ввод в указать произвольным типы для десериализации.

Практически хотя, в вашем случае любой вредоносный ввод позаботится о Liquid, так что вы должны быть в порядке.

Сказанное, я действительно не вижу причин для сериализации/десериализации вообще, так как ваши шаблоны являются просто текстом. При сериализации/десериализации даже снижается производительность.

+0

Спасибо. Есть ли у вас другой вариант для выполнения вышеуказанного? – bennick

+0

@bennick Извините, пропустил мою последнюю строку. Добавлено сейчас. – Agis

+0

Хорошо круто. Я просто не был уверен, что любое исключение удаленного кода может «просочиться», хотя объект Liquid :: Template во время процесса Marshal.load. – bennick