Meydan okuma - Çok adımlı kayıt formu
Çok adımlı form ve doğrulamayla güvenli bir kayıt uygulaması yazarsın.
Meydan okuma - Çok adımlı kayıt formu
Bu meydan okumada çok adımlı bir kayıt formu için doğrulama fonksiyonu yazacaksın. validateRegistration(array $data): array fonksiyonu e-posta ve şifre alanlarını denetler; hataları bir dizide toplar.
E-posta için filter_var($email, FILTER_VALIDATE_EMAIL) kullanırsın; geçersizse hata eklersin. Şifre uzunluğunu strlen ile kontrol edersin. Kullanıcı adını htmlspecialchars ile escape ederek güvenli çıktı sağlarsın. Bu, form doğrulama ve çıktı güvenliği bilgisini birleştirir.
Doğrula, sonra escape et
Doğrulama fonksiyonu hataları bir $errors dizisinde toplar. Boş alan için trim($value) === "" denetimi yaparsın. E-posta biçimi filter_var ile; şifre uzunluğu strlen($password) < 8 ile kontrol edilir.
Kullanıcı adını ekrana basarken htmlspecialchars($name, ENT_QUOTES, "UTF-8") çağrısı XSS riskini engeller. $_POST süper globalinden gelen veriyi önce doğrula, sonra escape et; sıra önemlidir.
Uygulama validateRegistration ve safeName fonksiyonlarını yaz
validateRegistration(array $data): array fonksiyonunu yaz. $data["email"] boşsa $errors[] = "E-posta gerekli" ekle; dolu ama filter_var ile geçersizse $errors[] = "Geçersiz e-posta" ekle. strlen($data["password"]) < 8 ise $errors[] = "Şifre çok kısa" ekle. Fonksiyon $errors dizisini döndürsün. Ayrıca safeName(string $name): string fonksiyonu htmlspecialchars($name, ENT_QUOTES, "UTF-8") döndürsün. Sonra $result = validateRegistration(["email" => "invalid", "password" => "123"]) ile çağır, foreach ($result as $error) { echo $error . "\n"; } ekle ve echo safeName("<b>Ayşe</b>") . "\n" satırını yaz.
Örnek çözümü göster
İki fonksiyonu tanımla; e-posta ve şifre denetimlerini ekle; htmlspecialchars ile safeName yaz; foreach ile çıktı ver.
Örnek çözüm:
<?php
// validateRegistration ve safeName fonksiyonlarını yaz
function validateRegistration(array $data): array {
$errors = [];
$email = trim($data["email"] ?? "");
if ($email === "") {
$errors[] = "E-posta gerekli";
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors[] = "Geçersiz e-posta";
}
$password = $data["password"] ?? "";
if (strlen($password) < 8) {
$errors[] = "Şifre çok kısa";
}
return $errors;
}
function safeName(string $name): string {
return htmlspecialchars($name, ENT_QUOTES, "UTF-8");
}
$result = validateRegistration(["email" => "invalid", "password" => "123"]);
foreach ($result as $error) {
echo $error . "\n";
}
echo safeName("<b>Ayşe</b>") . "\n";
Kendini test et
-
filter_var($email, FILTER_VALIDATE_EMAIL) ne döndürür?
- true veya false
- her zaman e-posta dizesi
- geçerliyse e-postayı, değilse false döndürür
- her zaman null
Cevabı göster
geçerliyse e-postayı, değilse false döndürür — Doğru. Geçerli e-postayı dize olarak, geçersizse false döndürür. Bu yüzden if içinde ! ile tersleriz.
-
filter_var çağrısını tamamla
$validEmail = filter_var($email, ____);Cevabı göster
$validEmail = filter_var($email, FILTER_VALIDATE_EMAIL); -
Fonksiyonları görevlerine eşle
- filter_var
- e-posta doğrular
- htmlspecialchars
- XSS engeller
- trim
- boşlukları keser
- strlen
- uzunluğu sayar