PHP, web geliştirme dünyasında en yaygın kullanılan sunucu taraflı programlama dillerinden biridir. Özellikle form işlemleri, kullanıcı etkileşiminin temelini oluşturur. Bu ders içeriğinde, PHP form işlemlerini detaylı bir şekilde ele alacak, örnek kodlar ve açıklamalarla konuyu anlaşılır hale getireceğiz.
PHP form işlemleri, kullanıcıların web sitelerinde doldurduğu formların sunucu tarafında işlenmesini sağlar. Bu işlemler, kullanıcıdan alınan verilerin doğrulanması, işlenmesi ve veritabanına kaydedilmesi gibi adımları içerir. PHP, bu süreçte hem güvenli hem de etkili bir şekilde kullanılabilir.
Formlar, kullanıcıdan veri almak için HTML’de kullanılan yapılardır. PHP, bu verileri alıp işlemek için mükemmel bir araçtır. Veri işleme işlemleri genellikle GET ve POST yöntemleriyle yapılır.
GET ve POST Yöntemleri Arasındaki Farklar:
- GET: Veriler URL üzerinden gönderilir ve bu nedenle sınırlı boyutta veri taşır.
- POST: Veriler HTTP isteğiyle gönderilir, URL’de görünmez ve daha büyük boyutlu veri taşınabilir.
GET Yöntemi
GET
yöntemi, form verilerini URL üzerinden sunucuya gönderir. Veriler, URL’nin sonuna eklenir ve bu nedenle tarayıcının adres çubuğunda görünür hale gelir. Bu yöntem genellikle veri almak (örneğin, arama sorguları) için kullanılır. GET yöntemiyle gönderilen veriler URL’de görüneceği için hassas veriler için uygun değildir.
GET Yöntemi Özellikleri:
- URL’de Görünür: Veriler, URL’nin sonuna
?
işaretiyle eklenir. Örneğin:https://kodkampusu.com/form_islem.php?isim=Oktay&email=oktay@example.com
- Sınırlı Veri Boyutu: URL uzunluğu sınırlı olduğu için büyük veriler gönderilemez.
- Güvenlik: Veriler URL’de göründüğü için hassas bilgiler (şifreler, kredi kartı bilgileri) gönderilmemelidir.
- Önbelleklenebilir: GET istekleri tarayıcı tarafından önbelleğe alınabilir.
GET Hangi Durumlarda Kullanılır?
- Veri almak istediğinizde (örneğin, arama sonuçları, filtreleme).
- Sayfalar arasında veri taşımak istediğinizde.
- Verilerin URL’de görünmesinde sakınca olmadığı durumlarda.
GET Yöntemi Örneği:
1 2 3 4 5 6 7 | <form action="form_islem.php" method="GET"> <label for="isim">İsim:</label> <input type="text" id="isim" name="isim"> <label for="email">E-posta:</label> <input type="email" id="email" name="email"> <input type="submit" value="Gönder"> </form> |
1 2 3 4 5 6 7 8 9 | <?php if ($_SERVER["REQUEST_METHOD"] == "GET") { $isim = $_GET['isim']; $email = $_GET['email']; echo "İsim: " . $isim . "<br>"; echo "E-posta: " . $email; } ?> |
Bu form gönderildiğinde, URL şu şekilde olacaktır:
https://kodkampusu.com/form_islem.php?isim=Oktay&email=oktay@example.com
POST Yöntemi
POST
yöntemi, form verilerini URL üzerinden değil, HTTP isteğinin gövdesi (body) üzerinden sunucuya gönderir. Bu yöntem, daha güvenli ve büyük verilerin gönderilmesi için uygundur.
POST Yöntemi Özellikleri:
- URL’de Görünmez: Veriler tarayıcının adres çubuğunda görünmez.
- Büyük Veri Boyutu: GET yöntemine göre daha büyük veriler gönderilebilir.
- Güvenlik: Hassas bilgiler (şifreler, kredi kartı bilgileri) için daha uygundur.
- Önbelleklenemez: POST istekleri tarayıcı tarafından önbelleğe alınmaz.
POST Hangi Durumlarda Kullanılır?
- Veri göndermek istediğinizde (örneğin, kullanıcı kaydı, giriş işlemleri).
- Hassas bilgiler (şifreler, kredi kartı bilgileri) gönderirken.
- Büyük boyutlu veriler gönderirken.
POST Yöntemi Örneği:
1 2 3 4 5 6 7 | <form action="form_islem.php" method="POST"> <label for="isim">İsim:</label> <input type="text" id="isim" name="isim"> <label for="email">E-posta:</label> <input type="email" id="email" name="email"> <input type="submit" value="Gönder"> </form> |
1 2 3 4 5 6 7 8 9 | <?php if ($_SERVER["REQUEST_METHOD"] == "POST") { $isim = $_POST['isim']; $email = $_POST['email']; echo "İsim: " . $isim . "<br>"; echo "E-posta: " . $email; } ?> |
GET ve POST Arasındaki Farklar
Özellik | GET Yöntemi | POST Yöntemi |
---|---|---|
Veri Gönderim Yeri | URL üzerinden | HTTP istek gövdesi üzerinden |
Veri Görünürlüğü | URL’de görünür | URL’de görünmez |
Veri Boyutu | Sınırlı (URL uzunluğu nedeniyle) | Büyük veriler gönderilebilir |
Güvenlik | Hassas bilgiler için uygun değil | Hassas bilgiler için uygun |
Önbelleklenebilirlik | Evet | Hayır |
Kullanım Alanı | Veri almak (arama, filtreleme) | Veri göndermek (kayıt, giriş) |
Form Verisi Doğrulama ve Güvenlik
Kullanıcıdan alınan veriler üzerinde doğrulama ve güvenlik işlemleri yapmak, hem web uygulamalarınızın güvenliğini sağlamak hem de kullanıcı deneyimini geliştirmek için oldukça önemlidir. Bu bölümde, detaylı bir şekilde form verilerinin doğrulanması ve saldırılara karşı alınması gereken önlemleri inceleyeceğiz.
Veri Kontrolleri
Kullanıcıdan gelen verilerin geçerli olup olmadığını kontrol etmek, olası hataları ve saldırıları önlemede ilk adımdır. PHP’de bu işlem, çeşitli yerleşik fonksiyonlar ve kontroller kullanılarak yapılabilir. empty()
fonksiyonu, bir değişkenin boş olup olmadığını kontrol eder. Bu, kullanıcının önemli bir alanı boş geçmesini önlemek için kullanılır.
1 2 3 4 5 6 7 8 9 10 | <?php if ($_SERVER["REQUEST_METHOD"] == "POST") { if (empty($_POST['isim'])) { echo "İsim alanı boş bırakılamaz!"; } else { $isim = $_POST['isim']; echo "Merhaba, $isim!"; } } ?> |
Veri Tipi Kontrolü
Bazı alanlarda belirli veri türlerinin (örneğin, sayı veya e-posta) gönderilmesi beklenir. PHP ile bu tür kontroller yapılabilir. is_numeric()
fonksiyonu, bir değerin sayısal olup olmadığını kontrol eder. Örneğin, bir yaş alanına metin yerine sayı girmesini sağlamak için kullanılır.
1 2 3 4 5 6 7 8 9 10 | <?php if ($_SERVER["REQUEST_METHOD"] == "POST") { $yas = $_POST['yas']; if (!is_numeric($yas)) { echo "Yaş alanına yalnızca sayı girebilirsiniz!"; } else { echo "Yaşınız: $yas"; } } ?> |
XSS Saldırılarına Karşı Korunma
XSS saldırıları, kullanıcıdan alınan verilere zararlı kodların yerleştirilmesiyle gerçekleşir. Bu tür saldırılara karşı en etkili yöntem, kullanıcıdan alınan veriyi işlenmeden önce temizlemektir. htmlspecialchars()
fonksiyonu, HTML özel karakterlerini dönüştürerek zararlı kodların çalıştırılmasını engeller. Örneğin, <script>
etiketi gibi zararlı bir kod, "<script>"
olarak işlenir ve etkisiz hale gelir.
1 2 3 4 | <?php $isim = htmlspecialchars($_POST['isim']); echo "Güvenli isim: $isim"; ?> |
SQL Injection’a Karşı Korunma
SQL Injection, bir SQL sorgusuna zararlı komutların enjekte edilmesiyle yapılan saldırılardır. Bu tür saldırılara karşı, kullanıcı verilerini veritabanına eklemeden önce doğrulamak ve işlemek gerekir. mysqli_real_escape_string()
fonksiyonu, kullanıcı tarafından gönderilen verilerdeki zararlı karakterleri temizler ve SQL Injection riskini azaltır.
1 2 3 | <?php $isim = mysqli_real_escape_string($baglanti, $_POST['isim']); ?> |
CSRF (Cross-Site Request Forgery) Saldırılarına Karşı Korunma
CSRF saldırıları, kullanıcının bilgisi olmadan başka bir siteye istek göndermek için yapılır. Buna karşı korunmak için form verilerinde bir CSRF token kullanılabilir. CSRF token, bir formun sahte bir kaynaktan gönderilmesini önler. Her kullanıcıya özel olarak üretilen bir token kullanılır ve bu token, sunucuda doğrulanır.
1 2 3 4 | <form method="POST" action="islem.php"> <input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>"> <button type="submit">Gönder</button> </form> |
1 2 3 4 5 6 | <?php session_start(); if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) { die("Geçersiz istek!"); } ?> |
PHP ile Veri Filtreleme ve Doğrulama
PHP, kullanıcılardan alınan verileri filtrelemek ve doğrulamak için yerleşik filtreleme fonksiyonları sağlar. Bu yöntemler, özellikle e-posta ve URL gibi belirli formatların doğrulanmasında çok kullanışlıdır.
E-Posta Adresi Doğrulama
FILTER_SANITIZE_EMAIL
; Bir e-posta adresini doğrulamak ve gereksiz karakterleri temizlemek için kullanılır.
1 2 3 4 5 6 7 8 | <?php $email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL); if (filter_var($email, FILTER_VALIDATE_EMAIL)) { echo "Geçerli e-posta: $email"; } else { echo "Geçersiz e-posta adresi!"; } ?> |
URL Kontrolü
FILTER_VALIDATE_URL
; Bir URL adresini doğrulamak için kullanılır.
1 2 3 4 5 6 7 8 | <?php $url = filter_var($_POST['websitesi'], FILTER_SANITIZE_URL); if (filter_var($url, FILTER_VALIDATE_URL)) { echo "Geçerli URL: $url"; } else { echo "Geçersiz URL adresi!"; } ?> |
Örnek form oluşturma
Öğrendiğimiz bilgiler doğrultusunda bir form yapısı oluşturalım. Oluşturduğumuz formu php ile bağlayalım ve gereken güvenlik önemlerini de alarak form yapısını güçlendirelim.
HTML Kodu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <!DOCTYPE html> <html lang="tr"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>PHP Form Örneği</title> </head> <body> <h1>Kullanıcı Bilgi Formu</h1> <form action="islem.php" method="POST"> <label for="isim">İsim:</label> <input type="text" id="isim" name="isim" required><br><br> <label for="email">E-posta:</label> <input type="email" id="email" name="email" required><br><br> <label for="yas">Yaş:</label> <input type="number" id="yas" name="yas" min="18" max="100" required><br><br> <input type="submit" value="Gönder"> </form> </body> </html> |
action="islem.php"
: Formdan gönderilen veriler,islem.php
dosyasında işlenecektir.method="POST"
: Form verileri HTTP POST yöntemiyle gönderilir. Bu, verilerin URL’de görünmesini engeller ve daha güvenlidir.required
: Alanların doldurulmasını zorunlu kılar.min
vemax
: Yaş alanında minimum ve maksimum değer sınırlarını belirler.
PHP Kodu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <?php if ($_SERVER["REQUEST_METHOD"] == "POST") { // Kullanıcıdan gelen verileri alıyoruz $isim = htmlspecialchars(trim($_POST['isim'])); $email = htmlspecialchars(trim($_POST['email'])); $yas = htmlspecialchars(trim($_POST['yas'])); // Boş alan kontrolü if (empty($isim) || empty($email) || empty($yas)) { die("Lütfen tüm alanları doldurunuz!"); } // E-posta doğrulama if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { die("Geçersiz e-posta adresi!"); } // Yaş kontrolü if (!is_numeric($yas) || $yas < 18 || $yas > 100) { die("Yaşınız 18 ile 100 arasında olmalıdır!"); } // Güvenli veri çıktısı echo "<h1>Form Verileri</h1>"; echo "İsim: " . $isim . "<br>"; echo "E-posta: " . $email . "<br>"; echo "Yaş: " . $yas . "<br>"; } ?> |
$_SERVER["REQUEST_METHOD"]
: Formun POST yöntemiyle gönderilip gönderilmediğini kontrol eder.htmlspecialchars()
: Zararlı kodların çalıştırılmasını önler. Örneğin,<script>
etiketlerini etkisiz hale getirir.trim()
: Kullanıcının girdiği verilerin başındaki ve sonundaki gereksiz boşlukları temizler.filter_var()
: E-posta adresinin geçerliliğini kontrol eder.is_numeric()
: Yaşın yalnızca sayı olmasını sağlar.
Form güvenliğini artırmak için alınan önlemleri açıklayalım:
- XSS Koruması:
Kullanıcıdan alınan veriler,htmlspecialchars()
ile temizlendiği için zararlı JavaScript kodları çalıştırılamaz.- Örnek: Kullanıcı
<script>alert('Hack');</script>
girerse, bu kod<script>alert('Hack');</script>
olarak işlenir ve etkisiz hale gelir.
- Örnek: Kullanıcı
- SQL Injection Koruması:
Eğer veriler bir veritabanına kaydedilecekse,mysqli_real_escape_string()
veya PDO kullanılarak SQL Injection saldırılarına karşı önlem alınmalıdır. - Doğrulama ve Sınırlandırma:
FILTER_VALIDATE_EMAIL
ile geçerli bir e-posta adresi sağlanır.is_numeric()
vemin/max
kontrolleri ile yaş alanına yalnızca uygun değerler girilmesi sağlanır.