1

我有一个简单的 ActiveRecord 类,它记录一个事件并使用该serialize方法存储一些额外的数据。它有一个用于事件的字符串列和一个用于存储数据对象的文本列。

# 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. 我的目标是提供一种方法来从我的应用程序中的任何位置记录事件并存储有关该事件的任何类型的数据。有没有比我在这里设置的更好的方法来执行此操作?
4

1 回答 1

2

一般来说,序列化你想要的任何东西都很好。任何类型的用户数据都是可以接受的。

这假定您已修补到绝对最新版本的 Rails 3.2 或 4.0。过去 YAML 和 JSON 序列化存在一些问题,但这些问题已得到修补和解决。

使用GemCanary之类的工具针对已知漏洞测试您的应用程序,以确保您是最新的,并发现未来的问题。

于 2013-07-19T16:44:59.423 回答