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