Railsは簡単だが、落とし穴にはまると痛い目を見る
Railsは確かにコードの記述量を減らしてくれるのだが、セキュリティに関する知識まで補完してくれるわけではない。
たとえば、ユーザが入力した情報を元に、usersテーブルに新しいレコードを追加する場合、以下のように書けば簡単だ。
@user = User.new(params[:user])
これは大嘘である。チュートリアルを鵜呑みにしてはいけない。
もし悪意のあるユーザがこの処理を行うアクションを、自作のフォームから呼び出したらどうなるだろうか? 推測可能なテーブルのカラムはすべて設定可能となってしまうだろう。
例えば、現金に交換可能なポイントを格納するpoints int not null default 0
というカラムが存在したとする。名前がそのままなので、ユーザでも簡単にカラム名を推測できるだろう。
<input type="text" name="user[points]"/>
このような場合、この1行を正規のフォームに追加するだけで、悪意のあるユーザは何ポイントでも獲得できる。
同様の状況はupdate_attributes
メソッドでも発生する。これらのメソッドは、値が信用できるハッシュに対してのみ使用するべきだ。
Railsは確かに簡単ではあるが、ユーザの入力するデータに関しては、従来通り十分な注意を払う必要があるだろう。