2013-07-19 56 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