認証ありの 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されなくなるので、安全なコードとなる。
サンプルではなかなかこの書き方が出回っていないように見受けられるので、知っておいたほうがいいかと思う。