[ruby-on-rails] valid_password를 고안하는 데 이상한 문제가 있습니까?
지난 2 시간 동안 나는 로그인을 허용하지 않는 이상한 문제를 devise에서 디버깅하려고했습니다.
내가 언급하는 내용은 다음과 같습니다.
password
=> 'vinodsobale'
password == 'vinodsobale'
=> true
resource.valid_password?(password)
=> false
resource.valid_password?('vinodsobale')
=> true
스크린 샷도 첨부 :
참고 : devise 내부에서 디버거를 활성화 했으므로 위의 코드는 내부 코드를 고안했습니다.
나에게 그것은 Devise.secure_compare
.
답변
이 문제는 수정 된 Ruby 2.2.0의 알려진 문자열 손상 버그로 인해 발생합니다. 2.2.2 .
버그 보고서에 설명 된대로 BCrypt가 C 확장에서 특정 문자열 생성 API를 호출 할 때 손상이 발생했습니다.이 API는 Devise v3.3.0 ::BCrypt::Engine.hash_secret
이 Devise::Models::DatabaseAuthenticatable#valid_password?
메서드 에서 호출 하여 트리거되었습니다 . Devise 별 해결 방법이 버그에 대한 이 v3.5.0에 게시되었습니다.
해결책은 다음 중 하나입니다.
- Ruby를로 다운 그레이드
< 2.2.0
하거나로 업그레이드하십시오>= 2.2.2
. - Devise를
>= 3.5.0
.
답변
어때
resource.valid_password?(password.to_s)
도움이되기를 바랍니다.
답변
Devise DatabaseAuthenticatable#valid_password?
는 Encryptor::compare
2 개의 객체, 현재 저장된 비밀번호와 비교하려는 새 비밀번호를 취하는 메소드를 사용하고 있습니다.이 메소드에는 중간에있는 두 번째 매개 변수를 수정하여 대신 객체를 수정하는 부작용이 있다고 생각합니다. 한 번은 두 번 수정되어 잘못된 결과가 발생하므로 중복 된 암호 개체를 전달하면 작동 할 수 있습니다. 사용해 볼 수있어?valid_password? password.dup
답변
원본 소스와 본체 간의 인코딩 문제 일 수 있습니다. 를 실행 password.codepoints
하면 실제 인코딩을 볼 수 있습니다. 실행 .codepoints
원시 ‘암호’문자열은 반환해야합니다 [112, 97, 115, 115, 119, 111, 114, 100]
.