2011-02-25 1 views
2

은 레일 평안한 인증은 첫 ​​번째 시도로 사용자를 찾을 수Ruby on Rails에서 User.find_by_id (세션 [: user_id])를 사용하여 사용자를 식별하는 것이 얼마나 안전할까요? 예를 들어

User.find_by_id(session[:user_id]) 

를 사용합니다. 그래서

  1. 세션이 쿠키의 사용에 의해에만 저장되어있는 경우 (이 그냥 쿠키를 사용하여 모든 세션 정보를 저장하는 레일 옵션이 아닙니다?) 다음 사용자 ID와 할 수없는 사용자가 12345 변경 그의 12345에서 12346 사이의 쿠키 값을 다른 사용자로 가장합니까? 세션이 다른 사람이 쿠키를 훔치는 척 할 수없는 다음, 쿠키 등의 SESSION_ID에 의해, 그리고 DB에 세션 정보를 조회

    I. 경우 보조 노트로


그 사용자가 되려면? (차단 인터넷 트래픽으로 쿠키 훔치기)

II. 또는 3 번째 선택은 쿠키 auth_token을 사용하여 remember_token 필드에 대한 사용자 테이블을 확인하는 것이므로 다른 사람이 쿠키를 훔쳐 해당 사용자로 가장 할 수 있습니까?

답변

3

쿠키 보안, 세션 하이재킹 및 훨씬 더 많은 내용이 모두 Ruby on Rails Security Guide.에 있습니다. 반드시 읽어야합니다.

+0

좋은 가이드 –

+0

인데 질문에 대한 간단한 답변이 있으십니까? –

0

세션이 서버에 저장된 쿠키를 참조하기 때문에 이런 일은 발생하지 않습니다. 사용자 브라우저에 저장되는 유일한 ID는 서버에서 세션을 가져 오는 데 사용되는 ID입니다. 그래서 그들은 세션에 대한 암호화를 얻을 수 없다면, 사용자는 내가 방금 설명한 이유 때문에 체계적으로 ID를 추측 할 수 없을 것입니다.

업데이트

변화 서버 대신 JDL의 대답에서 쿠키

+1

레일스의 기본 동작은 전체 세션을 쿠키에 저장하는 것입니다. 서버에 선택적으로 저장할 수 있습니다. – jdl

+0

잘 알고 있기 때문에, 나는 그 문서들 – s84

+0

을 통과 할 필요가 있지만 심지어 레일즈 애플리케이션이 생성 될 때 생성 된 비밀 키에 의해 쿠키가 암호화된다. AFAIK – Gareth

1

에 세션을 저장하는 기본, 일부 단락이있다 :

클라이언트는 모든 것을 당신을 볼 수 있습니다 세션에 저장하는 이유는 일반 텍스트 (실제로는 Base64로 인코딩되어 있으므로 암호화되지 않은)에 저장되기 때문입니다. 물론, 여기에 비밀을 저장하고 싶지는 않습니다. 세션 해시 조작을 방지하기 위해 서버 측 암호가있는 세션에서 다이제스트가 계산되어 쿠키의 끝 부분에 삽입됩니다.

즉,이 저장소의 보안은이 암호 (및 손상되지 않은 SHA512가 기본값 인 요약 알고리즘)에 따라 달라짐을 의미합니다. 사소한 비밀, 즉 사전의 단어 또는 30 자보다 짧은 단어를 사용하지 마십시오. 당신의 environment.rb에있는 비밀을 넣어 :

config.action_dispatch.session = { 
    :key => '_app_session', 
    :secret => '0x0dkfj3927dkc7djdh36rkckdfzsg...' 
} 

참고 : 중단 경고 : 나는 config.action_dispatch.session 또는 config.action_controller.session, 또는 레일 3.0.1가 제안입니다 확실하지 않다 config.action_controller.session가 사용되지 않습니다. 대신 Rails.application.config.session_store을 사용하십시오.

+0

나는 이것을 내 대답에 추가하려고했다. 하지만 기본값에 대해서는 말하지 않습니다. – s84

관련 문제