ぞえの技術めも

Ruby on Rails勉強中

【60日目】【1日20分のRailsチュートリアル】【第7章】Strong parametersで悪意のあるアクセスを防ぐ

Ruby on Railsチュートリアル(第3版)

今日は「7.3.2 Strong parameters」から。

7.3.2 Strong parameters

@user = User.new(params[:user])    # 実装は終わっていないことに注意!

リスト7.16のコメントと、上の再録コメントでも重ねて指摘しているように、この実装は最終形ではありません。
その理由は、paramsハッシュ全体を初期化するという行為はセキュリティ上、極めて危険だからです。 (中略)
paramsハッシュがまるごとUser.newに渡されてしまうと、どのユーザーでもadmin=’1’をWebリクエストに紛れ込ませるだけでWebサイトの管理者権限を奪い取ることができてしまいます。

個人情報がいとも簡単に盗まれてしまう危険性もあるってことですね。。。
こわいね。

Rails 4.0ではコントローラ層でStrong Parametersというテクニックを使用することが推奨されています。
(中略)
上のようにparamsハッシュをまるごと渡すとエラーが発生するので、Railsはデフォルトでマスアサインメントの脆弱性から守られるようになりました。

7.3.1でエラー出てたのはそういうことかー。

この場合、paramsハッシュでは:user属性を必須とし、名前、メールアドレス、パスワード、パスワードの確認の属性をそれぞれ許可し、それ以外を許可しないようにしたいと考えています。

今はUserモデルにはadmin属性はないけど、今後追加したときにparams[:user]だとそのadmin属性も登録できてしまうし管理者権限も奪い取れる。
けど、属性を限定することでこちらが意図しないユーザー登録はできないようにできる、ってことかな。

↓が分かりやすかった。

www.techscore.com

app/controllers/users_controller.rb

  :
  def create
    @user = User.new(user_params)
    if @user.save
      # Handle a successful save.
    else
      render 'new'
    end
  end

  private

    def user_params
      params.require(:user).permit(:name, :email, :password,
                                   :password_confirmation)
    end
end

この時点で、(送信ボタンを押してもエラーが出ないという意味で) ユーザー登録フォームは動くようになります。

動作見てみましょう。

サーバーを起動して

$ rails server -b $IP -p $PORT

<ローカルアドレス>/signupでユーザー登録ページにアクセス。

昨日と同じように無効なユーザー情報をフォームに入力してボタンをクリック。

f:id:kt_zoe:20161026124027p:plain

エラー画面は出なくなったけど、ユーザー登録に成功したのか失敗したのか分からない状態。

また、有効なユーザー情報を送信しても新しいユーザーが実際に作成されることもありません。

これは試してないけどそうなのか。。。

今日の作業時間は【26分】

次は「7.3.3 ユーザー登録のエラーメッセージ」から。