2013-07-19 32 views
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 

问题

  1. serialize方法使用YAML默认存储状物体这个。在用户提交一些通过参数传递的狡猾代码的情况下,是否存在安全风险?当数据字段被检索和反序列化时,是否有机会执行用户提交的Ruby代码?
  2. 我的目标是提供一种方法来记录来自于任何类型的有关该事件的我的应用程序和存储数据的任何地方的事件。有没有更好的方法来实现这个比我在这里设置的更好?

回答

2

总体而言,这是完全正常的序列化,你想要的任何东西。任何类型的用户数据都可以接受。

这假设你已修补到绝对最新的版本的Rails 3.2或4.0。过去,YAML和JSON序列化存在一些问题,但这些问题已经修补并解决。使用像GemCanary的工具,以确保您的电流,并赶上未来的问题针对已知漏洞

测试您的应用程序。

+0

Thanks @tadman。对于我在此处制定的通用日志模型,有更好的方式提出任何建议吗?或者我所做的工作做得好吗? – bennick

+0

你会希望比较YAML,JSON和元帅的性能和数据存储特性,你承诺一个特定的序列化方法之前,与非平凡的数据量的测试是必不可少总是得到这样的事情的权利。记住''data''赋值行可以通过['slice'](http://api.rubyonrails.org/classes/Hash.html#method-i-slice)方法轻松完成:'data = params。片(:名称,:电子邮件:消息)' – tadman

+0

考虑的另一点是,如果真的有必要使用序列化列,而不是额外的三列自由形式的数据。序列化最适合复杂的嵌套Hash和Array类型值结构,或者当数据的性质高度不可预测且基本无模式时。 – tadman