ボクココ

個人開発に関するテックブログ

Rails での Model.find(params[:id]) の恐怖

認証ありの Rails アプリケーションでのよくある話。

例えばこんなコードがあるとしよう。現在のユーザーの記事一覧を取得するコードだ。

class ArticlesController < ActionController::Base
  before_action :authenticate_user!
  
  def show
    @article = Article.find(params[:id])
  end
end

このコード、一見すると正しく動いて特に問題ないように見える。だがセキュリティ的に危険なところがある。それは、 他のログインしたユーザーなら誰でも指定の記事が見えてしまう という問題だ。 ActiveRecord を使っていれば、auto_increment なid 付与が一般的であるため、他人の記事が簡単に読めてしまう。記事であれば別に見られてもいいだろうけど、他のプライベートな情報をこのロジックでやるとアウト。

対応方法

こんな書き方で対応できる。

class ArticlesController < ActionController::Base
  before_action :authenticate_user!
  
  def show
    @article = current_user.articles.find(params[:id])
  end
end

自分の持つ記事の中でfind をかけるというやり方。こうすれば他人の記事はfindされなくなるので、安全なコードとなる。

サンプルではなかなかこの書き方が出回っていないように見受けられるので、知っておいたほうがいいかと思う。