1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

今更ながら Ruby on Rails Tutorial をやってみた (その10)

Last updated at Posted at 2019-04-28

この記事について…

普段は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を使用しないようにデグレードしてみます。

app/controllers/users_controller.rb
  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メソッドを使用して無理やりエラーが発生しないようにしています。

参考
https://teratail.com/questions/124330

デグレードの修正をしても、特にユーザ登録処理の動作に変わりはありません。

さて、Firefoxのインスペクター機能を起動して、HTMLを書き換えます。
インスペクタータブを開き、入力フォーム近辺のHTMLで右クリック⇒HTMLとして編集を選択します。
そして、パスワードエディットのHTMLを参考にそれっぽくadminフラグを操作するチェックボックスを追加します。

1.png

HTMLの編集を終えてブラウザ画面に戻ると、偽装したAdminチェックボックスが増えています。
チェックボックスをチェックありに変更して[Create my account]を押下すると…

2.png

通常通りユーザ登録ができました。

3.png

試しにUsersページに遷移すると、admin権限がないと表示されないはずのdeleteリンクが表示されています!

4.png

Railsの出力をみると、確かにadmin = 't'としてinsertしていることがわかります。
これはかなりまずいことです。

5.png

大急ぎで先ほどデグレードさせたparams[:user].to_unsafe_hという箇所をuser_paramsに戻します。
そして同様にHTMLを編集してAdminチェックボックスを増やし、同様の手順でユーザ登録してみます。
そのときのRailsの出力をみると…

6.png

Unpermitted parameter: :adminという出力が1行増えています。adminは許可されていないので弾いてくれたようです!
事実、admin権限は与えられていませんでした。

実際に脆弱性を突いてみると、対策の意味がより分かるなぁと感じました。

それでは、次回 第11章から再開したいと思います。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?