フィヨルドブートキャンプの課題レビューで指摘されたシリーズ。
セキュリティに関わることなので大事。
form_with
の中でユーザーに何かを入力させることなく何らかの値の受け渡しを行いたいときにはhidden_field
を使う場合があると思いますが、データの中身によってはやめておいたほうがいいかもしれません。
例えばこんな場合。
メモのタイトルと本文をユーザーが入力するフォーム内に、hidden_field
を設置してユーザーのidを一緒に送信しようとしてる。
<%= form_with(model: memo, local: true) do |form| %> <div class="field"> <%= form.label :title %> <%= form.text_field :title %> </div> <div class="field"> <%= form.label :body %> <%= form.text_area :body %> </div> #メモを作ったユーザーのidを投稿者idとしてタイトルや本文と一緒に送る <div class="field"> <%= form.hidden_field :user_id, :value => @user_id %> </div> <div class="actions"> <%= form.submit %> </div> <% end %>
こうしてしまうと、@user_id
の部分に開発者ツール等を使って任意の値を入れられた場合に他人になりすましてメモの作成ができてしまいます。
さすがにそれはセキュリティ的にアウトなので、こういう場合はhidden_field
は使わず、送信先のcontrollerで対象となるモデルのインスタンスとuser_id
を紐付けるようにすると良いそう。
def create @memo = Memo.new(memo_params) @memo.user_id = current_user.id if @memo.save #以下略 ・ ・ ・ end
まとめ
こういうの指摘される前に自分で気付いて潰せるようにならないといけないですが、ぶっちゃけ最初からそれは難しいので、指摘してもらえたものから順に覚えていければと思うております。