Laravel 9는 bcrypt로 해시된 유효한 비밀번호를 거부합니다.
P粉270842688
P粉270842688 2024-03-28 17:22:24
0
1
529

Laravel 9에서 일부 비밀번호 확인 실패 문제를 해결하는 데 며칠이 걸렸습니다. 비밀번호 testperson 解析为哈希值 yxc/wAmNCKV.YhpWOfyNoetCj/r3Fs5TyAskgZuIF/LEItWfm7rPW. 해당 데이터베이스 테이블을 직접 쿼리하여 이것이 올바른 해시 값인지 확인합니다. 그러나 Laravel의 인증 인프라는 이 비밀번호를 거부하고 인증을 거부합니다.

흔한 일이 아닙니다. 올바르게 구문 분석되는 비밀번호가 여러 개 있습니다. 예를 들어, 비밀번호 eo 解析为 y$uNWYvMVmagIwQ2eXnVKLCOAK1QFQdcRtxbvlghf.Xpg0U1w.N./N2를 입력하면 Laravel이 해당 비밀번호를 확인합니다. 동일한 메커니즘으로 두 사용자 레코드가 모두 생성되지만 권한은 서로 다릅니다(레코드의 부울 값으로 표시됨).

이 스택 오버플로 질문과 이 Treehouse 스레드에서 거짓 부정을 반환하는 것으로 식별된 함수 password_verify에서 버그를 발견했습니다.

구체적으로 다음은 오류 지점이 발생하는 Laravel의 스택입니다.

  • login 路由通过控制器类调用 IlluminateFoundationAuthAuthenticatesUsers::login .
  • login 方法调用 IlluminateFoundationAuthAuthenticatesUsers::attemptLogin.
  • attemptLogin 方法调用控制器守卫对象的 attempt 방법.
  • IlluminateAuthSessionGuard::attempt 调用 IlluminateAuthSessionGuard::hasValidCredentials.
  • IlluminateAuthSessionGuard::hasValidCredentials 调用守卫提供者对象上的 validateCredentials 방법.
  • IlluminateAuthEloquentUserProvider::validateCredentials 在其 hasher 对象上调用 check 방법.
  • IlluminateHashingHashManager::check 在其驱动程序上调用 check 방법.
  • IlluminateHashingBcryptHasher::check 调用 IlluminateHashingAbstractHasher::check.
  • IlluminateHashingAbstractHasher::check 호출 IlluminateHashingAbstractHasher::check 调用 password_verify.

전체 스택을 확장한 후 로그인 컨트롤러의 login 메서드에서 다음 코드를 실행합니다.

으아아아

이 컨텍스트를 덤프하세요:

으아아아

해당 비밀번호를 SELECT users WHERE password= 쿼리에 입력하면 예상한 사용자를 얻게 됩니다.

무슨 일이에요? 이 문제를 어떻게 해결할 수 있나요?

P粉270842688
P粉270842688

모든 응답(1)
P粉464082061

귀하가 제공한 해시가 "테스트 담당자" 해시라는 귀하의 주장은 실제로 잘못된 것 같습니다. 해시는 단방향이므로 표시된 해시의 출처를 알 수 없습니다. 참고: PHP 7.4에서 작동하지만 passwd_hash()의 솔트 옵션이 더 이상 사용되지 않기 때문에 PHP 8 이상에서는 작동하지 않을 것 같습니다.

으아아아
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿