我在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对象,但这确实包含可怕用户提供的数据。我需要注意哪些安全注意事项?
答案 0 :(得分:1)
理论上, 是您实施中的安全问题。
通过设计,:: load可以反序列化几乎任何加载到的类 Ruby进程。在许多情况下,这可能会导致远程代码执行 Marshal数据是从不受信任的来源加载的。
因此,:: load不适合作为通用序列化 格式,你永远不应该解组用户提供的输入或其他 不受信任的数据。
如果需要反序列化不受信任的数据,请使用JSON或其他 序列化格式,只能加载简单,'原始' 类型,如字符串,数组,哈希等。绝不允许用户输入 指定要反序列化的任意类型。
实际上,在你的情况下,任何恶意输入都是由Liquid处理的,所以你应该没问题。
那就是说,我根本没有看到任何序列化/反序列化的原因,因为你的模板只是纯文本。序列化/反序列化时甚至会有性能损失。