[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_secretDevise::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::compare2 개의 객체, 현재 저장된 비밀번호와 비교하려는 새 비밀번호를 취하는 메소드를 사용하고 있습니다.이 메소드에는 중간에있는 두 번째 매개 변수를 수정하여 대신 객체를 수정하는 부작용이 있다고 생각합니다. 한 번은 두 번 수정되어 잘못된 결과가 발생하므로 중복 된 암호 개체를 전달하면 작동 할 수 있습니다. 사용해 볼 수있어?valid_password? password.dup


답변

원본 소스와 본체 간의 인코딩 문제 일 수 있습니다. 를 실행 password.codepoints하면 실제 인코딩을 볼 수 있습니다. 실행 .codepoints원시 ‘암호’문자열은 반환해야합니다 [112, 97, 115, 115, 119, 111, 114, 100].


답변