0

Ruby on Rails を使用して、モデルの一意の ID を増やして作成しています。たとえば、最初のユーザーのユーザー ID は 1、2 番目のユーザーは 2、3 番目のユーザーは 3 です。

これはセキュリティの観点からは好ましくありません。誰かが最後に作成されたユーザーのユーザー ID を詮索できる場合 (おそらく新しいユーザーを作成することによって)、彼らはあなたの成長率を推測できるからです。また、ユーザー ID を簡単に推測することもできます。

代わりにランダム ID を使用する良い方法はありますか?

人々はこれについて何をしましたか?Google 検索では、ほとんど何もわかりません。

4

4 に答える 4

1

ユーザー ID を公開することをセキュリティ上の欠陥とは考えていません。セキュリティのための他のメカニズムが必要です。訪問者が約束した100万人のユーザーがいないことに気付いたとき、それは「マーケティングのセキュリティ上の欠陥」かもしれません;-)

ともかく:

URL 内の ID をまったく回避するには、すべての場所でユーザーのログインを使用できます。./\#?ログインに、ルートで問題を引き起こす特殊文字 (など)が含まれていないことを確認してください(ホワイトリストの正規表現を使用します)。また、ログイン名は後で変更できない可能性があり、ページへのハード リンク/検索エンジン エントリがある場合に問題が発生する可能性があります。

呼び出しの例は/users/Jeffand/users/Jeff/editの代わりに/users/522047and/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
于 2012-06-21T07:13:36.743 に答える
0

未承認のアクセスを防ぐために、適切な承認レイヤーを追加する必要があります。

showコントローラーのアクションでユーザー情報を表示するUsersとします。コードは次のとおりです。

class UsersController < ActionController::Base

  before_filter :require_user

  def show
    @user = User.find(params[:id])
  end

end  

この実装は、ID の推測に対して脆弱です。show アクションが常にログインしているユーザーの情報を表示するようにすることで、簡単に修正できます。

def show
  @user = current_user
end

URL に指定された ID に関係なく、現在のユーザー プロファイルが表示されます。

アカウント管理者とアカウント所有者が show アクションにアクセスできるようにしたいとします。

def show
  @user = current_user.has_role?(:admin) ? User.find(params[:id]) : current_user
end

OTH 承認ロジックは、CanCanなどの gem を使用してより適切に実装されます。

于 2012-06-21T06:08:06.557 に答える
0

random_idまたはと呼ばれるフィールドを User モデルに追加します。次に、ユーザーを作成するときに、次のコードを UsersController に配置します。

def create
  ...
  user.random_id = User.generate_random_id
  user.save
end

このコードを User クラスに配置します。

# random_id will contain capital letters and numbers only
def self.generate_random_id(size = 8)
  alphanumerics = ('0'..'9').to_a + ('A'..'Z').to_a
  key = (0..size).map {alphanumerics[Kernel.rand(36)]}.join

  # if random_id exists in database, regenerate key
  key = generate_random_id(size) if User.find_by_random_id(key)

  # output the key
  return key
end

小文字も必要な場合は、それらを英数字に追加し、カーネルから正しい乱数を取得していることを確認してくださいKernel.rand(62)

また、ルートやその他のコントローラーを変更してrandom_id、デフォルトの代わりにを使用するようにしてくださいid

于 2012-06-21T05:30:22.207 に答える
0

ランダムな INTEGER ID を生成したとしても、非常に簡単に侵害される可能性があります。MD5 や SHA1 ("asd342gdfg4534dfgdf") などのユーザーごとにランダムなトークンを生成する必要があります。そして、このランダム ハッシュを使用してユーザー プロファイルにリンクする必要があります。

これは実際にはハッシュの概念ではなく、単なるランダムな文字列であることに注意してください。

別の方法は、たとえば、ニックネームでユーザーにリンクすることです。

しかし、私の推測では、ユーザー ID やユーザー数、またはユーザーの増加率を知っていること自体は脆弱性ではありません!

于 2012-06-21T04:19:24.617 に答える