1
我有记录一个事件,并使用serialize
方法存储一些额外的数据的简单ActiveRecord类。它有一个用于事件的字符串列和一个用于存储数据对象的文本列。ActiveRecord序列化,这是安全的吗?
# DB Columns
# event => string
# data => text
#
class MyLog < ActiveRecord::Base
serialize :data
validates :event, :data, :presence => true
end
在我的控制,我想采取用户提交的信息,并把它作为数据:
class ContactFormController < ApplicationController
def send_message
...
data = {name: params[:name], email: params[:email], message: params[:message]}
MyLog.create(event: "User submitted contact form", data: data)
...
end
end
问题
- 的
serialize
方法使用YAML默认存储状物体这个。在用户提交一些通过参数传递的狡猾代码的情况下,是否存在安全风险?当数据字段被检索和反序列化时,是否有机会执行用户提交的Ruby代码? - 我的目标是提供一种方法来记录来自于任何类型的有关该事件的我的应用程序和存储数据的任何地方的事件。有没有更好的方法来实现这个比我在这里设置的更好?
Thanks @tadman。对于我在此处制定的通用日志模型,有更好的方式提出任何建议吗?或者我所做的工作做得好吗? – bennick
你会希望比较YAML,JSON和元帅的性能和数据存储特性,你承诺一个特定的序列化方法之前,与非平凡的数据量的测试是必不可少总是得到这样的事情的权利。记住''data''赋值行可以通过['slice'](http://api.rubyonrails.org/classes/Hash.html#method-i-slice)方法轻松完成:'data = params。片(:名称,:电子邮件:消息)' – tadman
考虑的另一点是,如果真的有必要使用序列化列,而不是额外的三列自由形式的数据。序列化最适合复杂的嵌套Hash和Array类型值结构,或者当数据的性质高度不可预测且基本无模式时。 – tadman