2010-11-18 2 views
0

나는 PhotoAlbum 모델을 가지고 있습니다.레일 - 모델 UID 만들기

내가 만든 Rails가 PhotoAlbum의 UID를 마술처럼 생성하고 싶습니다. 가급적이면 아주 긴 숫자/영숫자 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 값이 두 앨범에서 동일 할 것입니다. 오리지널 포스터가 일반적인 기본 앨범 이름을 만들거나 사람들이 "내 파티"와 같은 것을 앨범 이름으로 사용한 경우에는 그리 멀지 않습니다. "생일의 역설"을 찾아보고 http://jeff.aaron.ca/cgi-bin/birthday – oskarpearson

3

레일은 기본적으로 당신을 위해 데이터베이스 ID를 처리합니다.

당신은 인증을 처리하기 위해 플러그인을 사용해야하며, ID를 알고 있어도 나쁜 사람은 아무 것도 할 수 없습니다.

0

어떻게 after_initialize 후크를 사용하는 방법에 대한;

는 스키마에 그 일에 관해서는, 나는, 내가 거기에 전문가는 아니지만 그건 당신이 사용중인 데이터베이스 엔진에 따라 달라집니다 거라 생각?

나는 당신이 기본 키로 UUID를 원하지 않는다는 가정하에 일하고있다. 나는 당신의 목적을 위해 그것을 피할 것입니다.

불행히도 테스트하지 않고이 모든 작업을 수행하고 있기 때문에 오타가 없었 음을 100 % 확신 할 수 없습니다. 문제가 발생하면 언제든지 메시지를 보내주십시오.

먼저 uuidtools를 프로젝트에 추가해야합니다. "설치 sudo는 레이크 보석"하고 보석을 다운로드하고 설치해야 위, 실행이 추가 한 레일이 가정이 설정/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 

나는이 도움이되기를 바랍니다.

Oskar