前書き
下の例を見て「なぜコントローラーで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