この記事について…
普段はRuby on Railsと無縁なプログラマなんですが、今更ながら面白そうという単純な理由からRuby on Rails Tutorialをやってみようと思い立ちました。今回は前回の記事の続きで第10章をやっていきます。
尚、Rails 5.1に対応した第4版を用いて、かつHyper-V上にインストールしたUbuntu 18.04の環境で進めていきます。
第10章 ユーザーの更新・表示・削除
この章では今まで未実装だったedit/update/index/destroyアクションを実装してRESTアクションを完成させます。
曖昧だったStrong Parametersの理解
参考
Rails4 | 新規・変更機能 | マスアサインメント機能と脆弱性とStrong Parameters
https://qiita.com/tbpgr/items/63028f5e19a2d1617e40
なんとなくおまじないのように実装していたStrong Parameters。実際どのような脆弱性を対策しているんだろうなーと思っていたのですが、上記の参考サイトでブラウザの開発者ツールを使用して脆弱性を突く方法が解説されていてやっとしっくり来ました。
Ubuntu 18.04にプリインストールされているFirefox(Ver.66.0.3)で実際にやってみようと思います。
まずは、第10章実装完了の状態からワザとStrong Parametersを使用しないようにデグレードしてみます。
def create
@user = User.new(params[:user].to_unsafe_h) # [※1]
if @user.save
log_in @user
flash[:success] = "Welcome to the Sample App!"
redirect_to @user
else
render 'new'
end
end
[※1]
params[:user]
とだけ記述すると、RailsがActiveModel::ForbiddenAttributesError
を発生させます。危ないから使うなよーと注意喚起してくれているのですが、今回は検証なのでto_unsafe_h
メソッドを使用して無理やりエラーが発生しないようにしています。
デグレードの修正をしても、特にユーザ登録処理の動作に変わりはありません。
さて、Firefoxのインスペクター機能を起動して、HTMLを書き換えます。
インスペクタータブを開き、入力フォーム近辺のHTMLで右クリック⇒HTMLとして編集を選択します。
そして、パスワードエディットのHTMLを参考にそれっぽくadminフラグを操作するチェックボックスを追加します。
HTMLの編集を終えてブラウザ画面に戻ると、偽装したAdminチェックボックスが増えています。
チェックボックスをチェックありに変更して[Create my account]を押下すると…
通常通りユーザ登録ができました。
試しにUsersページに遷移すると、admin権限がないと表示されないはずのdeleteリンクが表示されています!
Railsの出力をみると、確かにadmin = 't'としてinsertしていることがわかります。
これはかなりまずいことです。
大急ぎで先ほどデグレードさせたparams[:user].to_unsafe_h
という箇所をuser_params
に戻します。
そして同様にHTMLを編集してAdminチェックボックスを増やし、同様の手順でユーザ登録してみます。
そのときのRailsの出力をみると…
Unpermitted parameter: :admin
という出力が1行増えています。adminは許可されていないので弾いてくれたようです!
事実、admin権限は与えられていませんでした。
実際に脆弱性を突いてみると、対策の意味がより分かるなぁと感じました。
それでは、次回 第11章から再開したいと思います。