ユーザー ID を公開することをセキュリティ上の欠陥とは考えていません。セキュリティのための他のメカニズムが必要です。訪問者が約束した100万人のユーザーがいないことに気付いたとき、それは「マーケティングのセキュリティ上の欠陥」かもしれません;-)
ともかく:
URL 内の ID をまったく回避するには、すべての場所でユーザーのログインを使用できます。./\#?
ログインに、ルートで問題を引き起こす特殊文字 (など)が含まれていないことを確認してください(ホワイトリストの正規表現を使用します)。また、ログイン名は後で変更できない可能性があり、ページへのハード リンク/検索エンジン エントリがある場合に問題が発生する可能性があります。
呼び出しの例は/users/Jeff
and/users/Jeff/edit
の代わりに/users/522047
and/users/522047/edit
です。
to_param
ユーザー クラスでは、ユーザー ID の代わりにルートのログインを使用するようにオーバーライドする必要があります。この方法では、ルート ファイルやヘルパーのようなものを置き換える必要はありませんlink_to @user
。
class User < ActiveRecord::Base
def to_param
self.login
end
end
User.find
次に、すべてのコントローラーで次のように置き換えUser.find_by_login
ます。
class UsersController < ApplicationController
def show
@user = User.find_by_login(params[:id])
end
end
または、 a を使用しbefore_filter
て前のパラメーターを置き換えます。ネストされたリソースを持つ他のコントローラーの場合は、次を使用しますparams[:user_id]
。
class UsersController < ApplicationController
before_filter :get_id_from_login
def show
@user = User.find(params[:id])
end
private
# As users are not called by +id+ but by +login+ here is a function
# that converts a params[:id] containing an alphanumeric login to a
# params[:id] with a numeric id
def get_id_from_login
user = User.find_by_login(params[:id])
params[:id] = user.id unless user.nil?
end
end