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