1

メソッドを使用してイベントをログに記録し、いくつかの追加データを保存する単純な ActiveRecord クラスがありserializeます。イベント用の 1 つの文字列列と、データ オブジェクトを格納するためのテキスト列があります。

# 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 に答える