Railsは簡単だが、落とし穴にはまると痛い目を見る

Railsは確かにコードの記述量を減らしてくれるのだが、セキュリティに関する知識まで補完してくれるわけではない。

たとえば、ユーザが入力した情報を元に、usersテーブルに新しいレコードを追加する場合、以下のように書けば簡単だ。

@user = User.new(params[:user])

これは大嘘である。チュートリアルを鵜呑みにしてはいけない。

もし悪意のあるユーザがこの処理を行うアクションを、自作のフォームから呼び出したらどうなるだろうか? 推測可能なテーブルのカラムはすべて設定可能となってしまうだろう。

例えば、現金に交換可能なポイントを格納するpoints int not null default 0というカラムが存在したとする。名前がそのままなので、ユーザでも簡単にカラム名を推測できるだろう。

<input type="text" name="user[points]"/>

このような場合、この1行を正規のフォームに追加するだけで、悪意のあるユーザは何ポイントでも獲得できる。

同様の状況はupdate_attributesメソッドでも発生する。これらのメソッドは、値が信用できるハッシュに対してのみ使用するべきだ。

Railsは確かに簡単ではあるが、ユーザの入力するデータに関しては、従来通り十分な注意を払う必要があるだろう。