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された場合でも、ここで:token
をpermit
していなければ、値が変えられることはない、ということです。
朗報だね(ニッコリ)。