2010-11-18 11 views
0

私はモデルPhotoAlbumを持っています。Rails - モデルのUIDを作成する

PhotoAlbumの作成時にRailsを魔法のように作成したいと思います。悪い人がこのUIDを持っていたかのように、非常に長い数字/英数字のUIDが悪いことをする可能性があります。上

提案:

  • 何どこUIDを割り当てるために、UID
  • を作るために使用するには、私は、デフォルト値としてスキーマでそれを行うことができますか?または以前のように、または作成した後のモデルで?それを行うにはどうしたらいいですか?

おかげ

答えて

2

シンプルな16進数キーはどうですか?擬似乱数データとモデルデータを組み合わせて、それをhexdigestに入れて、かなりユニークなキーを得るだけで、簡単なチェックでそれが本当にユニークであることを確認できます。

class Album 
    before_create :set_uid 

    protected 
    def set_uid 
     # This only works before_create obviously, otherwise it would 
     # find itself and loop eternally. 
     while self.uid.blank? or !Album.find_by_uid(self.uid).blank? 
     self.uid = Digest::SHA1.hexdigest("--#{self.title}--#{Time.current.usec}--") 
     end 
    end 
end 

あなたはおそらくそれを少しきれいにすることができますが、それはうまくいくはずです。

スキーマでそれを行うために、私はそれはあなたが使っているものをデータベースエンジンに依存推測として、私はそこには専門家だ;)

+0

私はそれを使用しませんでした - しかし、私はセキュリティについての妄想です。ソースコードが野放しになった場合、ハッカーは、少量のテストを行っているオブジェクトのUIDを推測することができます。エントリが作成された時点で、単にusecの組み合わせを試すことができます。 – oskarpearson

+0

または...誰かがあなたのサンプルを直接コピーアンドペーストすると、攻撃者は漏れたソースコードを必要とせず、あなたのものも持っています。彼らはタイトルを持っていると仮定し、Time.current.usecは999999までの数字しか返しませんので、 "秘密"を得る前に999999の可能性をチェックする必要があります – oskarpearson

+0

さらに楽しく:これは実際には合理的な規模のサービス - 何十万ものアルバムが作成されています。最終的にTime.current.usecは同じ番号を返します。アルバムのタイトルが同じで、usec値が同じ場合は、uid値が2つのアルバムで同じになることを意味します。元のポスターが共通のデフォルトアルバム名を作成する場合、またはアルバム名として「My Party」のようなものを使用した場合、それはそれほどではありません。 「誕生日のパラドックス」を見て、http://jeff.aaron.ca/cgi-bin/birthdayを試してください – oskarpearson

3

RailsはデフォルトではあなたのためのデータベースIDを処理します。

あなたは真実のセキュリティを使用すべきではありませんが、プラグインを使用して認証と承認を処理する必要があります。そのIDを知っていても悪意のある人は何もできません。

0

どうafter_initializeフックを使用してはどうですか?

私は、UUIDをプライマリキーとして使用しないことを前提に作業しています(そうしないと状況がより複雑になります)。私はあなたの目的のためにそれを避けるだろう。

私はテストをしなくてもこのことをすべてやっていますが、残念ながら、私は100%私は何の誤植もしていないと確信することはできません。何か問題が発生した場合は、私にメッセージしてください。

まず、プロジェクトにuuidtoolsを追加する必要があります。 「:インストールsudoのすくい宝石」と、それは宝石をダウンロードしてインストールする必要がありますが、上記、実行が追加したら、レール2と仮定すると、これは設定/ environment.rbに

Rails::Initializer.run do |config| 
    .. 
    # You can try a later uuidtools version, but this is the one I've worked with 
    config.gem "uuidtools", :version => '2.1.1' 
    .. 
end 

です。

validates_length_of :uuid, :is => 36 # Untested.. makes sense to me though 
    def after_initialize 
    self.uuid ||= UUIDTools::UUID.random_create.to_s 
    end 

をし、テーブルを作成するための移行中:

次に、あなたのモデルでは、このコードを追加

create table :photo_albums do |t| 
    .. 
    t.string :id, :limit => 36 
    .. 
end 

私はそれが役に立てば幸い。

オスカー

関連する問題