password_verify() ile doğrulama
password_verify() ile düz parolayı hash'le karşılaştırmayı öğrenirsin.
password_verify nasıl çalışır?
password_verify($password, $hash) düz parolayı elindeki hash ile karşılaştırır ve true veya false döndürür. Hash'in içindeki tuz ve maliyet bilgisi otomatik okunur; sen ekstra bir şey yapmazsın.
Doğrulama sırasında zamanlama saldırılarını (timing attack) önlemek için sabit süreli karşılaştırma kullanılır. Bu yüzden == ile kendi karşılaştırmanı yazma; her zaman password_verify kullan.
hash_equals ne işe yarar?
Bazen iki dizeyi güvenle karşılaştırmak gerekir: CSRF token, OTP kodu gibi. == operatörü karakterleri sırayla karşılaştırır ve ilk farkta durur; bu süre saldırgana ipucu verir.
hash_equals($known, $userInput) her zaman aynı sürede çalışır; böylece zamanlama saldırısı engellenir. password_verify da içeride buna benzer bir yöntem kullanır.
Uygulama verify fonksiyonunu yaz
verify($password, $hash) fonksiyonu tanımla. İçinde password_verify ile parolayı kontrol edip bool döndürsün. $hash değişkeni zaten tanımlı. verify("gizli123", $hash) ve verify("wrong", $hash) çağır; her sonucu "geçerli" veya "geçersiz" olarak yazdır.
Örnek çözümü göster
"geçersiz") . "\n"; ve echo (verify("wrong", $hash) ? "geçerli" : "geçersiz") . "\n"; çağır.
Örnek çözüm:
<?php
$hash = password_hash("gizli123", PASSWORD_DEFAULT);
function verify($password, $hash) {
return password_verify($password, $hash);
}
echo (verify("gizli123", $hash) ? "geçerli" : "geçersiz") . "\n";
echo (verify("wrong", $hash) ? "geçerli" : "geçersiz") . "\n";
Kendini test et
-
password_verify çağrısını tamamla
$valid = ____($password, $hash);Cevabı göster
$valid = password_verify($password, $hash); -
İki hash'i == ile karşılaştırmak neden risklidir?
- Zamanlama saldırısına açıktır
- Yanlış sonuç verebilir
- Daha yavaştır
- PHP hata verir
Cevabı göster
Zamanlama saldırısına açıktır — Doğru. == ilk farkta durur; bu süre saldırgana ipucu verir.
-
Doğrulama kavramlarını eşleştir
- password_verify
- Hash ile karşılaştırır
- hash_equals
- Sabit süreli karşılaştırma
- true
- Eşleşme başarılı
- false
- Eşleşme yok