ハッシュ化とは
ハッシュ化とは,ハッシュ化したい文字や数字をハッシュ関数という関数にかけるとハッシュ化された値がかえってくる.そのハッシュ化された値からは元の値を求めることはできないというものである.
ハッシュ化するメリット
ハッシュ化された値からもとの値を求めることはできないため
セキュリティ対策に効果がある.URLのidはハッシュ化するべきであり,
できていないととても危険!!!
やり方
①まずhashidsというパッケージをインストールする.
Gemfile
にパッケージを記述する.
gem 'hashids'
上のコードをGemfile
に書いく.
次にターミナルでhashidsをインストールする.
bundle install
これでhashidsのインストールは完了である.
② ハッシュidの初期化
初期化をすることでセキュリティが向上する.
application_controller.rb
にハッシュidを初期化するコードを書く.
"your_salt"
には好きな文字列を入れる.これはソルトであり,ソルトとはハッシュ化されたidに追加する文字列であり,追加することによりセキュリティ対策が向上する.後ろにハッシュ化した文字列の文字数を指定できる.今回は20文字にしている.
class ApplicationController < ActionController::Base
before_action :initialize_hashids
private
def initialize_hashids
@hashids = Hashids.new("your_salt",20)
end
end
③最後にURLのidをハッシュ化する
routes.rb
でidをハッシュ化する
params: :idをつけることでidをハッシュ化することができる.
resources :users, param: :id do
このようにハッシュ化する
④ハッシュ化したidからもとのidに戻すには
_controller.rb
でハッシュ化したidから元のidを求めるにはdecodeすることで求められる.
やり方
@hashids.decode関数の中にIDを入れて求める.
配列でかえってくるため,firstを用いて初めの値だけを受け取る.
@hashids.decode(prams[:ID]).first
例
def show
item_id = @hashids.decode(params[:id]).first
@item = Item.find_by(id: item_id)
end
⑤ViewsやControllerでidをハッシュ化する
やり方
@hashids.encode関数の中にIDを入れて求める.
@hashids.encode(ID)と書いてIDをencodeでハッシュ化する
例
Views
の例
<%= link_to(item.title, item_path(@hashids.encode(item.id))) %>
Controller
の例
redirect_to("/items/#{@hashids.encode(item_requested.id)}")