ume

rails7 コントローラーの中のparamsでurlのidを受け取る際に気をつけること

前書き

下の例を見て「なぜコントローラーでurlに含まれるid(1)を①のように使ったらダメなのか」がわからない人は是非この記事を読み進める価値がありそうです.

このurlに含まれるユーザーのid1をサーバーに送ったとする

http://www.domain.com/health/1 

①(なぜ下記のようにid:1を使用してはいけないのか) コントローラー↓

class HealthsController < ApplicationController

  def show
    @health = Health.find(params[:id])
  end

end 

なぜこの書き方(Health.find(params[:id]))が良くないのか?

閲覧権限のないページまで閲覧できてしまうから.要は他人のページが見れてしまう。

例えばダイエット関連のアプリがあるとする。このアプリではユーザーごとに体重の情報が閲覧できるとする。

変更前

http://www.domain.com/health/1 

変更後

http://www.domain.com/health/41

のようにurl内のidを変更すると.
コントローラー内

class HealthsController < ApplicationController

  def show
    @health = Health.find(params[:id]) #idに41が代入される
  end

end 

その結果ユーザー1さんがユーザー41さんのページの閲覧が可能になる

どう改善する?

@health = @current_user.healths.find(params[:id])

のように現在のユーザーのアクセス権も含めてデータを取得するようにする。こうすることで簡単には他人のデータにアクセスできないようになります

まとめ

  • ユーザーから送信されるいかなるパラメータであっても、何らかの操作が加えられている可能性が常にあるので安心できない

参考情報

https://railsguides.jp/security.html#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E7%AE%A1%E7%90%86