2013-02-06 3 views
2

내 앱에는 User 모델이 있고 rememberable_token 열이 있습니다. 사용자를 생성 할 때, 임의의 보안 문자열은 사용자에 대한 보안 토큰으로서 작용하는 before_create 필터에 저장된다 : 세션 제어기세션 쿠키에 관한 Ruby on Rails 보안

user.rememberable_token = SecureRandom.urlsafe_base64 

, 그 때문에 그 토큰의 값에 영구 쿠키를 생성

세션 컨트롤러 :

def create 
    . 
    . 
    cookies.permanent.signed[:permanent_user_session] = user.rememberable_token 
end 

def logout 
    cookies.delete :permanent_user_session 
    redirect_to root_url 
end 

공동 그들이 logout 작업을 통해 로그 아웃 할 때 사용자가 로그 아웃됩니다 만 브라우저를 닫을 때 로그 아웃 및되지 않습니다 okie는 응용 프로그램 제어기에서 현재 사용자가 있는지 판별하고 일부 제어기에서 사용자가 로그인되어 권한이 있는지 판별하는 데 사용되는 before_filter에 사용됩니다.

응용 프로그램 컨트롤러 :

def current_user 
    @current_user ||= User.find_by_rememberable_token(cookies.signed[:permanent_user_session]) if cookies.signed[:permanent_user_session] 
end 

def authorize 
    unless User.find_by_rememberable_token(cookies.signed[:permanent_user_session]) 
    render :action => 'login' 
    end 
end 

이 안전하거나 세션 하이재킹하는 경향이 경우 경우 문제는? 하이재킹이 발생하기 쉬운 경우 session#logout 메서드에서 기존 쿠키를 삭제하기 직전에 사용자에 대한 새로운 rememberable_token을 만들었지 만 (해당 값으로 새 쿠키를 만들지는 않은 경우) 괜찮습니까?

감사합니다.

답변

1

사람이 쿠키를 훔치는 경우,이 코드 :

def current_user 
@current_user ||= User.find_by_rememberable_token(cookies.signed[:permanent_user_session]) if cookies.signed[:permanent_user_session] 
end 

여전히 작동합니다. 로그 아웃 방법에서는 사용자 테이블에서 토큰을 삭제하고 로그인시 다시 작성해야합니다.

기본적으로 생성시 수행해야하는 작업은 로그인 할 때마다 수행해야하며 각 로그 아웃시 되돌려 야합니다.

+0

사용자가 일주일 동안 로그인 상태를 유지하면 쿠키를 훔친 사람은 누구나 세션을 도용 할 수 있습니다. 이게 걱정 스러운가, 아니면 어떤 유형의 로그인 세션 쿠키로 실제로 가능합니까? – ilmhlueq

+0

이것은 세션 쿠키의 취약점이 아닙니다. 서버 측에서 세션을 유지하고 쿠키의 세션 ID 만 유지하는 경우에도 동일합니다. 30 분마다 세션이 만료 될 수 있지만 각 요청마다 타이머가 재설정됩니다. 이렇게하면 공격자가 공격을 수행하는 데 30 분의 간격 만 제공되지만 사용자를 몇 주 동안 로그인 상태로 유지할 수있는 기능도 제거됩니다. – Eduard

+3

또한주의하십시오. 데이터베이스에 영구 로그인 쿠키 (토큰) 만 저장하지 마십시오. 로그인 토큰은 Password Equivalent (암호 등가)이므로 공격자가 데이터베이스에 손을 대면 토큰을 사용하여 마치 일반 텍스트 로그인 - 암호 조합처럼 토큰을 사용하여 모든 계정에 로그인 할 수 있습니다. 따라서 지속적인 로그인 토큰을 저장할 때 강력한 salt 해시 (bcrypt/phpass)를 사용하십시오. 이 항목과이 항목에서 찾을 수있는 로그인에 대한 자세한 내용은 다음과 같습니다. http://stackoverflow.com/questions/549/the-definitive-guide-to-forms-based-website-authentication – Eduard

0

아마이 작업을 수행 할 것 : 세션에

작성 : 세션에

random_string = SecureRandom.urlsafe_base64 
cookies.permanent.signed[:permanent_user_session] = random_string 
user.rememberable_token = Digest::MD5.hexdigest(random_string) && user.save 

파괴 : 응용 프로그램 컨트롤러에서

cookies.delete :permanent_user_session 

:

def current_user 
    @current_user ||= User.find_by_rememberable_token(Digest::MD5.hexdigest(cookies.signed[:permanent_user_session])) if cookies.signed[:permanent_user_session] 
end 

def authorize 
    unless @current_user 
    render :action => 'login' 
    end 
end 

이를 너는 ~이야. 토큰의 해시를 추적하고 새 로그인이 새로 생성 될 때마다 새로 생성됩니다 (모든 로그 아웃마다 만료 됨). Rails는 CSRF를 다루지 만 장기적인 세션은 좋은 생각이 아닙니다.