2012-02-20 2 views
8

레일스의 쿠키에 작은 데이터 (10 자 미만)를 저장해야하며 보안이 필요합니다. 나는 그 누구도 데이터 조각을 읽거나 자신의 데이터 조각을 삽입 할 수 없기를 바란다. 쿠키의 내용을 암호화하는 것은 갈 길이라고 생각합니다 (서명해야합니까?). 가장 좋은 방법은 무엇입니까?Rails로 암호화 된 쿠키 저장하기

지금 당장이 작업을 수행합니다. 보안 성이 뛰어나지 만 보안에 대한 것보다 훨씬 많은 것을 알고 많은 사람들이 보안에 취약한 것으로 밝혀졌습니다.

나는 이런 식으로 비밀 절약 해요 :

encryptor = ActiveSupport::MessageEncryptor.new(Example::Application.config.secret_token) 
cookies[:secret] = { 
    :value => encryptor.encrypt(secret), 
    :domain => "example.com", 
    :secure => !(Rails.env.test? || Rails.env.development?) 
} 

을 한 후 나는이처럼 읽고 있어요 :

encryptor = ActiveSupport::MessageEncryptor.new(Example::Application.config.secret_token) 
secret = encryptor.decrypt(cookies[:secret]) 

보안인가요? 그것을하는 더 나은 방법?

업데이트 : 나는 레일 '세션에 대해 알고는 쿠키에 서명함으로써 선택적으로 세션 서버 측의 내용을 저장하고 나는 그것을 위해 무엇인지에 대한 세션을 사용합니까 모두에 의해, 보안 방법. 하지만 여기 내 질문은 세션에 원하지 않는 정보 인 쿠키를 저장하는 것이지만 여전히 보안이 필요합니다.

+0

왜, 정의상보다 안전한 서버 측이 아닌 쿠키에 저장해야하는 이유는 무엇입니까? – Russell

+0

@russell 글쎄 브라우저에 무엇인가를 저장해야합니까? 그렇지 않으면 다시 식별 할 수 없습니다. 테이블의 실제 데이터 또는 레코드의 ID 여부에 관계없이 데이터 크기 및 기타 고려 사항에 대한 선호도 및 필요성이 중요합니다. 내가 저장하고있는 것은 이미 테이블에있는 레코드의 ID입니다. 다른 테이블을 만들 수도 있지만이 경우에는 낭비처럼 보입니다. – Pablo

+0

DB를 사용하기 위해 기본 세션 저장소를 변경하면 테이블 생성과 관련하여 매우 적은 오버 헤드로 원하는 보안을 제공 할 것이라고 생각하므로 답변을 추가했습니다. – Russell

답변

0

나는 올바른 대답이었고 올바른 방향으로 나를 지적했기 때문에 그가 삭제했다고 JacobM 님의 답변을 다시 게시했습니다. 그가 그것을 삭제 취소하면, 나는 이것을 삭제하고 가장 좋은 대답으로 그를 선택합니다. 당신이 encrypt_and_verify 대신 encrypt으로 사용하는 경우 모든

첫째, 그것은 당신을 위해 쿠키를 서명합니다.

그러나 보안과 관련하여 필자는 내 자신을 압도하기보다는 공개적으로 조사 된 솔루션 인 에 항상 의지하는 것을 선호합니다. 예는 encrypted-cookies gem입니다.

+0

서명 된 쿠키를 사용하지 않는 이유가 궁금합니다 (레일스 3.x에서 기본적으로 지원됨) –

+1

@KandadaBoggu encrypt_and_verify 또는 암호화 된 쿠키 gem (1.0 이후)이 처리하는 쿠키는 서명되었지만 암호화되었습니다. 이 데이터 조각이 드러나지 않는다면 심각하지는 않겠지 만, 나는 그것에 대해 생각하지 않고, 암호화하여 보안을 유지하므로 사용자에게 불투명합니다. – Pablo

+0

그건 이해가 .. –

13
  • cookies.signed[:secret] # returns "foo bar" 
    

이 쿠키는 ActionController::Base.cookie_verifier_secret를 사용하여 서명 된 쿠키를 액세스 보안 쿠키를

cookies.signed[:secret] = { 
:value => "foo bar", 
:domain => "example.com", 
:secure => !(Rails.env.test? || Rails.env.development?) 
} 
  • 설정. 이니셜 라이저 파일에 cookie_verifier_secret을 설정할 수 있습니다.

  • +0

    세션을 사용하고 싶지 않습니다. 내 세션은 도메인 (blah.example.com)마다 이루어지며,이 데이터는 전체 시스템 (.example.com)을위한 세션이므로 도메인을 설정할 때 도메인 옵션을 사용합니다. – Pablo

    +0

    답변이 업데이트되었습니다. –

    +0

    .signed로 설정된 쿠키는 .signed로 액세스해야합니다. 따라서 두 번째 코드 블록은'cookies.signed [: secret]'이어야합니다. –

    1

    KandadaBoggu가 말한 것처럼 세션 변수가 원하는 것처럼 보이며 세션 변수는 기본적으로 암호화되어 쿠키에 저장됩니다. 당신이 config/initializers/session_store.rb의 내용을 살펴이있는 경우 그러나, 당신은 같은 것을 발견 할 것이다 다음 나에게 제안

    # Be sure to restart your server when you modify this file. 
    MyRailsApp::Application.config.session_store :cookie_store, :key => '_my_rails_app_session' 
    
    # Use the database for sessions instead of the cookie-based default, 
    # which shouldn't be used to store highly confidential information 
    # (create the session table with "rails generate session_migration") 
    # MyRailsApp::Application.config.session_store :active_record_store 
    

    당신이 shouldn 대신 쿠키 기반 기본의 세션에 대한 데이터베이스를 사용해야한다는 ' 매우 기밀 정보를 저장하는 데 사용됩니다. 미리 조리 된 이전으로 모든 것을 설정하기가 매우 쉬워 지므로 오버 헤드가 거의 발생하지 않으며, 일단 완료되면 나중에 새로운 비밀 정보를 추가해야하는 경우 기본적으로 제로 오버 헤드가 발생합니다!

    +0

    세션을 사용하고 싶지 않습니다. 내 세션은 도메인 (blah.example.com)마다 이루어지며,이 데이터는 전체 시스템 (.example.com)을위한 세션이므로 도메인을 설정할 때 도메인 옵션을 사용합니다. – Pablo