DB支持的Liquid Templates和Marshal.load的安全问题

时间:2016-05-25 19:02:38

标签: ruby security user-input liquid unmarshalling

我在PostgreSQL中存储电子邮件模板,以便用户可以编辑外发电子邮件。我正在使用Liquid来阻止服务器上的代码执行。为了帮助加快从数据库中获取电子邮件模板的过程,解析它,然后渲染它,我想要制作液体模板。以下是执行此操作的代码:

class Queue <T> {
    private var list = LinkedList<T> ()
    var isEmpty: Bool {
        return list.isEmpty
    }

我已经读过# 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? !! 可以导致远程代码执行。我将封送Liquid :: Template对象,但这确实包含可怕用户提供的数据。我需要注意哪些安全注意事项?

1 个答案:

答案 0 :(得分:1)

理论上, 是您实施中的安全问题。

来自Ruby documentation

  

通过设计,:: load可以反序列化几乎任何加载到的类   Ruby进程。在许多情况下,这可能会导致远程代码执行   Marshal数据是从不受信任的来源加载的。

     

因此,:: load不适合作为通用序列化   格式,你永远不应该解组用户提供的输入或其他   不受信任的数据。

     

如果需要反序列化不受信任的数据,请使用JSON或其他   序列化格式,只能加载简单,'原始'   类型,如字符串,数组,哈希等。绝不允许用户输入   指定要反序列化的任意类型。

实际上,在你的情况下,任何恶意输入都是由Liquid处理的,所以你应该没问题。

那就是说,我根本没有看到任何序列化/反序列化的原因,因为你的模板只是纯文本。序列化/反序列化时甚至会有性能损失。