ham-capのブログ

プログラミング学習の記録

【Rails】hidden_fieldにユーザー情報は載せないほうがいい

フィヨルドブートキャンプの課題レビューで指摘されたシリーズ。

セキュリティに関わることなので大事。

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

まとめ

こういうの指摘される前に自分で気付いて潰せるようにならないといけないですが、ぶっちゃけ最初からそれは難しいので、指摘してもらえたものから順に覚えていければと思うております。