無駄に色んなことを調べて「おかしい!なにも間違ってない!俺は間違ってない!!」 って思った頃にStrong Parameters の存在を思い出して「あーこれ何回目かな・・」って思う。
無駄に色んなことを調べて「おかしい!なにも間違ってない!俺は間違ってない!!」
Rails4のStrong Parametersの使い方まとめ [俺の備忘録]
って思った頃にStrong Parameters の存在を思い出して「あーこれ何回目かな・・」って思う。
attr_accessibleが使えなくてなんでだろうなーと思ったらこういうことでした。ちなみに私はRails 4を触ったのが初めてだったのでこれが1回目です。まあ誰もが通る道でしょうね
Strong Parameters とは
Mass Assignment脆弱性対策として追加された機能です。とりあえず書き方から見ていきましょう。名前通りモデルではなくパラメータ(params)に対して新しいメソッドが追加されています。
params.required(:必須パラメータ).permit(:許可されるパラメータ)
params.fetch(:対象のパラメータ,:対象のパラメータがnilだったときの値)
requiredに設定したパラメータがないと例外が飛んできます。また、これらのメソッドで指定していないパラメータは、これ以降なかったものとなります。
Mass Asignment脆弱性
ここにこういうフォームがあるじゃろ?
<form method="put" action="fuga/update"> <input type="text" name="hoge"> <input type="text" name="piyo"> <input type="submit" value="更新"> </form>
これをこうして
<form method="put" action="fuga/update"> <input type="text" name="id">←いたずらして追加 <input type="text" name="hoge"> <input type="text" name="piyo"> <input type="submit" value="更新"> </form>
こうじゃ
<ポチッ
通常は更新されないパラメータが、意図していないパラメータを加えたクエストを投げつけられることで更新されてしまうのがMass Assignment脆弱性です。今回の場合は何かのIDが更新されてしまって大変なことになってしまいます。GitHubがここを突かれてしまったこともありましたね。
github の mass assignment 脆弱性が突かれた件 - blog.sorah
こちらにはGitHubがこの脆弱性を突かれてしまうまでの顛末を書いてくれています。