Eğitim

Ders 8: Form İşleme ve Güvenlik

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:

  1. 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.
  2. İ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.
  3. Ş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.