概要
- 権限昇格とは:URL直接入力で、アクセス権のないページに到達できること
5.6 権限昇格 < Rails セキュリティガイド - Railsガイド - 対策:クエリでアクセス権を設定し、各アクションで「操作できるデータ」を制限する
対策例
devise
を使った場合
# コントローラ class HogesController < ApplicationController # 下記①で制限 before_action :set_current_user_hoge, only: %i[edit update destroy] # 下記②で制限 def index @blogs = Hoge.search(params[:term]).published end # 下記③で制限 def show @blog = Hoge.allowed_viewing(current_user).find(params[:id]) end # ... private # ①「ユーザのみの条件」でアクセス権を設定するクエリ def set_current_user_hoge @hoge = current_user.hoges.find(params[:id]) end
# モデル class Hoge < ApplicationRecord belongs_to :user # ②「モデルのみの条件」でアクセス権を設定するクエリ scope :published, -> { where('secret = FALSE') } # ③「ユーザとモデルの条件」でアクセス権を設定するクエリ scope :allowed_viewing, lambda { |current_user| where(user_id: current_user&.id).or(Hoge.published) }