🕵️

Railsでidをハッシュにして推測できないようにする

2020/12/13に公開

rails で model の id を露出させたくないときには、hashid-rails という gem を使うと便利です。
指定した id を一意の短いハッシュに変換してくれます。
https://github.com/jcypret/hashid-rails

使い方

インストール

Gemfile
gem "hashid-rails", "~> 1.0"
$ bundle install

設定する

今回は url がroot/users/:idになっているUsers#showに hashid-rails を設定します。

hashid-rails を使いたい model にinclude Hashid::Railsを記述します。

user.rb
class User < ApplicationRecord
  include Hashid::Rails
end

controller では find で user を取得しています。これは hashid-rails は関係なく、一般的なコードだと思います。

users_controller.rb
class UsersController < ApplicationController
  def show
    @user = User.find(params[:id])
  end
end

hashid-rails を適用する前・後を比較すると、

id が 1 -> b9YtZb,
URL だと、http://localhost:3000/users/1 -> http://localhost:3000/users/b9YtZb

になりました。

なお、DB に保存されている id をハッシュに書き替えることはありません。

メリット・デメリット

メリット

  • id を露出させたくないときに便利(url に入っている id から他のデータの存在を推測できないようにしたいなど)
  • 設定が簡単
  • DB の id は数字のままなので、途中から hashid-rails を追加したり削除することも簡単。

デメリット

  • 調査・お問い合わせ対応などでデータを特定したいときに ハッシュ id だと データを特定するときに不便。

Discussion