GitHub が Mass Assignment 脆弱性を突かれてからもう 5 年も経っているんですね。

ActiveRecord (というか ActiveModel) では適切に .permit したパラメータ以外は ActiveModel::ForbiddenAttributesError が発生するようになっていますが、MongoMapper ではそうなってなかったので対応させてみました。

プラグインの実装

ActiveModelForbiddenAttributesProtection をそのまま利用します。

module MongoMapper
  module Plugins
    module ForbiddenAttributesProtection
      extend ActiveSupport::Concern

      included do
        include ::ActiveModel::ForbiddenAttributesProtection
      end

      def attributes=(attrs = {})
        super sanitize_for_mass_assignment(attrs)
      end
    end
  end
end

利用する

とりあえず MongoMapper::Documentinclude した全てのクラスに適用するには以下を呼ぶ。

MongoMapper::Document.plugin(MongoMapper::Plugins::ForbiddenAttributesProtection)

ただし、各クラスが MongoMapper::Documentinclude するのより先に実行されている必要があると思います。

もしくは個別のクラスに適用する場合は普通に include でも良いです。

class User
  include MongoMapper::Document
  include MongoMapper::Plugins::ForbiddenAttributesProtection
end

これで、適切に .permit していない ActionController::Parameters をセットしたりしようとすると ActiveModel::ForbiddenAttributesError が発生するようになります。

もちろん雑に .to_h したりしたものを渡したりするとそれは検出できないので、そういうのは人間が気づく必要があります。