ztbuz@dev

人生に絶望しているZが、それでも技術を身につけようと必死になるブログ

Ruby on RailsのStrong Parametersの使い方

Ruby on Rails 4から、Strong Parametersというものが導入されたのですね。 これはRails 3でGitHubがMass Assignment脆弱性なるものを突かれた、という経緯があるらしいです。

このStrong Parametersの使い方についてまとめました。 もちろん自分のためです。。。

Mass Assignment脆弱性とは

たとえば、以下の内容がフォームからPOSTされたとします。

p params[:user] # => { :name => "foo", :email => "foo@foo.com" }

それを、このようにしてupdateしたとします。

@user = User.find(params[:id])
if @user.update_attributes(params[:user])
  # 処理
end

このままだと特に問題ないように思えます。 ……が、不正なフォームの使用などにより、以下のような内容がPOSTされるとします。

p params[:user] # => { :name => "foo", :email => "foo@foo.com", :token => "XXXXXXXXXXXXXXXX" }

Rails 3まではattr_accessibleで受け取るパラメータをホワイトリスト指定できたのですが、これを知らない開発者は:tokenの更新を許容してしまう、という問題です(たぶん)。

これを防ぐのがStrong Parameters、という訳です。

Strong Parametersとは

以下のように、params[:user]を直接渡すのではなく、以下のように一度フィルタリングします。

@user = User.find(params[:id])
if @user.update_attributes(user_params)
  # 処理
end

private

  def user_params
    params.require(:user).permit(:name, :email)
  end

requireは、ここで指定したキーを持っている場合のみ値を返します。 いわば一次フィルタです。

permitは、ここで指定したシンボルのみを返します。 先ほどの不正な値がPOSTされた場合でも、ここで:tokenpermitしていなければ、値が変えられることはない、ということです。

朗報だね(ニッコリ)。

参考記事