Giriş
Web uygulamalarında kullanıcıdan veri toplamak ve bu verileri işlemek için formlar kullanılır. Formlar, kullanıcı etkileşimini sağlar ancak doğru bir şekilde işlenmeleri ve güvenli bir şekilde saklanmaları gerekir. Bu makalede, PHP kullanarak form işlemenin temel adımlarını, form verilerini nasıl alacağınızı ve güvenlik önlemlerini detaylı bir şekilde öğreneceksiniz.
Form Oluşturma
HTML formları, kullanıcıdan bilgi toplamak için kullanılır. Formlar genellikle POST
veya GET
yöntemleri kullanılarak sunucuya gönderilir.
Basit Bir Form Örneği
HTML:
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<title>Form Örneği</title>
</head>
<body>
<form action="islem.php" method="post">
<label for="isim">İsim:</label>
<input type="text" id="isim" name="isim" required>
<br>
<label for="email">E-posta:</label>
<input type="email" id="email" name="email" required>
<br>
<input type="submit" value="Gönder">
</form>
</body>
</html>
Bu örnekte, kullanıcıdan isim ve e-posta bilgilerini toplamak için basit bir form oluşturulmuştur. Form verileri POST
yöntemi ile islem.php
dosyasına gönderilecektir.
Form Verilerini Alma
Form verilerini almak için PHP’nin süper global değişkenlerini kullanabilirsiniz. $_POST
ve $_GET
süper global değişkenleri, POST
ve GET
yöntemleri ile gönderilen form verilerini içerir.
islem.php:
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$isim = htmlspecialchars($_POST['isim']);
$email = htmlspecialchars($_POST['email']);
echo "İsim: " . $isim . "<br>";
echo "E-posta: " . $email;
}
?>
Bu örnekte, $_POST
süper globali kullanılarak form verileri alınır ve htmlspecialchars()
fonksiyonu kullanılarak XSS (Cross-Site Scripting) saldırılarına karşı güvenlik sağlanır.
Form Güvenliği
Form verilerini işlemek, çeşitli güvenlik önlemleri gerektirir. Aşağıdaki adımlar, form verilerini güvenli bir şekilde işlemek için kullanılır:
1. Veriyi Temizleme ve Doğrulama
Kullanıcının girdiği verileri temizlemek ve doğrulamak, uygulamanızın güvenliğini artırır. filter_var()
ve htmlspecialchars()
gibi fonksiyonlar bu amaçla kullanılır.
Örnek:
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$isim = filter_var(trim($_POST['isim']), FILTER_SANITIZE_STRING);
$email = filter_var(trim($_POST['email']), FILTER_SANITIZE_EMAIL);
if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
echo "Geçersiz e-posta adresi.";
} else {
echo "İsim: " . htmlspecialchars($isim) . "<br>";
echo "E-posta: " . htmlspecialchars($email);
}
}
?>
2. SQL Injection Önleme
SQL Injection saldırılarına karşı korunmak için, form verilerini veritabanına eklerken hazırlıklı ifadeler (prepared statements) kullanmalısınız.
Örnek:
<?php
$servername = "localhost";
$username = "kullanici_adiniz";
$password = "sifreniz";
$dbname = "veritabani_adiniz";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Bağlantı hatası: " . $conn->connect_error);
}
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$isim = filter_var(trim($_POST['isim']), FILTER_SANITIZE_STRING);
$email = filter_var(trim($_POST['email']), FILTER_SANITIZE_EMAIL);
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
$stmt = $conn->prepare("INSERT INTO kullanicilar (isim, email) VALUES (?, ?)");
$stmt->bind_param("ss", $isim, $email);
if ($stmt->execute()) {
echo "Veri başarıyla eklendi.";
} else {
echo "Hata: " . $stmt->error;
}
$stmt->close();
} else {
echo "Geçersiz e-posta adresi.";
}
}
$conn->close();
?>
3. CSRF (Cross-Site Request Forgery) Koruması
CSRF saldırılarına karşı korunmak için formunuza bir token ekleyin. Bu token, her form gönderiminde kontrol edilmelidir.
Örnek:
Form Sayfası (HTML):
<form action="islem.php" method="post">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
<label for="isim">İsim:</label>
<input type="text" id="isim" name="isim" required>
<br>
<label for="email">E-posta:</label>
<input type="email" id="email" name="email" required>
<br>
<input type="submit" value="Gönder">
</form>
PHP (Token Oluşturma ve Doğrulama):
<?php
session_start();
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die("CSRF token hatalı.");
}
$isim = htmlspecialchars($_POST['isim']);
$email = htmlspecialchars($_POST['email']);
echo "İsim: " . $isim . "<br>";
echo "E-posta: " . $email;
}
?>
Ödev
Bu derste öğrendiklerinizi pekiştirmek için aşağıdaki ödevleri yapmanız gerekmektedir:
- Kullanıcı Kayıt Formu: Bir kullanıcı kayıt formu oluşturun. Kullanıcı bilgilerini (isim, e-posta, şifre) alarak bu bilgileri bir veritabanına kaydedin. SQL Injection saldırılarına karşı korunmak için hazırlıklı ifadeler kullanın ve şifreleri güvenli bir şekilde saklayın.
- İletişim Formu: Bir iletişim formu oluşturun ve formdan gelen verileri e-posta ile gönderin. Form verilerini temizleyin ve doğrulayın. Ayrıca, CSRF saldırılarına karşı koruma ekleyin.
- Şifre Değiştirme Formu: Kullanıcıların şifrelerini değiştirebileceği bir form oluşturun. Şifrelerin güvenli bir şekilde saklandığından emin olun (örn. hashleme) ve kullanıcıyı başarılı bir şekilde bilgilendirin.
Bu ödevler, form işlemenin yanı sıra form güvenliğini sağlamanın önemini anlamanıza yardımcı olacaktır.