SQL Enjeksiyon Koruması: PHP ile Güvenli Veritabanı İşlemleri
Web uygulamaları, kullanıcıların giriş yaptıkları form alanlarından veya diğer veri giriş noktalarından gelen verileri güvenli bir şekilde işlemelidir. SQL enjeksiyonu, kötü niyetli kullanıcıların bu giriş noktalarını kullanarak veritabanına zararlı SQL kodları enjekte etmelerine olanak tanıyan bir saldırı türüdür. Bu makalede, PHP ile SQL enjeksiyonlarından korunmak için alınabilecek önlemleri inceleyeceğiz.
SQL Enjeksiyonu Nedir?
SQL enjeksiyonu, bir web uygulamasına gönderilen kullanıcı girişlerinin güvenli bir şekilde işlenmediği durumlarda ortaya çıkar. Kötü niyetli bir kullanıcı, giriş alanlarına eklediği özel karakterler veya sorgular aracılığıyla veritabanına zararlı SQL kodları enjekte edebilir. Bu durum, veritabanının yapılarını bozabilir, kullanıcı bilgilerini çalabilir veya uygulamanın çalışmasını engelleyebilir.
SQL Enjeksiyonlarından Korunma Yöntemleri:
1. Parametreli Sorgular Kullanma:
Parametreli sorgular, kullanıcı girişlerini doğrudan sorgu içine yerleştirmek yerine parametrelerle çalışan ve bu parametreleri güvenli bir şekilde işleyen sorgulardır.
php
Copy code
<?php
// SQL sorgusunda parametreli sorgu kullanma
$ad = $_POST['kullanici_ad'];
$sifre = $_POST['sifre'];
$sql = "SELECT * FROM kullanici WHERE kullanici_ad = ? AND sifre = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$ad, $sifre]);
$kullanicilar = $stmt->fetchAll();
?>
2. PDO veya MySQLi Kullanma:
PDO (PHP Data Objects) ve MySQLi, veritabanı işlemleri için kullanılan güvenli ve esnek sürücülerdir. Bu sürücüler, parametreli sorguların kullanılmasını destekler ve otomatik olarak girişleri temizler.
php
Copy code
<?php
// PDO kullanımı
$ad = $_POST['kullanici_ad'];
$sifre = $_POST['sifre'];
$stmt = $pdo->prepare("SELECT * FROM kullanici WHERE kullanici_ad = :ad AND sifre = :sifre");
$stmt->bindParam(':ad', $ad, PDO::PARAM_STR);
$stmt->bindParam(':sifre', $sifre, PDO::PARAM_STR);
$stmt->execute();
$kullanicilar = $stmt->fetchAll();
?>
3. Girişleri Filtreleme ve Doğrulama:
Kullanıcı girişlerini doğrulamak ve beklenmeyen karakterleri temizlemek için fonksiyonlar kullanın.
php
Copy code
<?php
// Kullanıcı adını doğrulama ve filtreleme
$kullanici_ad = filter_var($_POST['kullanici_ad'], FILTER_SANITIZE_STRING);
4. Error Reporting'i Sınırlama:
Geliştirme sırasında, SQL hatalarını gösteren error reporting özelliklerini kapatın. Bu, saldırganlara potansiyel bir hedef sağlamaktan kaçınmanıza yardımcı olacaktır.
php
Copy code
<?php
// Hata raporlamayı sınırlama
error_reporting(0);
5. Stored Procedures Kullanma:
Stored procedures, güvenlik açısından daha sağlam bir yöntemdir çünkü sorg
ular veritabanında önceden tanımlanır ve kullanıcı girişleri ile doğrudan birleştirilmez.
sql
Copy code
-- Stored Procedure örneği (MySQL)
CREATE PROCEDURE kullaniciGiris(IN ad VARCHAR(255), IN sifre VARCHAR(255))
BEGIN
SELECT * FROM kullanici WHERE kullanici_ad = ad AND sifre = sifre;
END;
Bu önlemler, SQL enjeksiyonlarına karşı koruma sağlamak adına alınabilecek temel önlemlerdir. Ancak, güvenlik konularında her zaman dikkatli olunmalı ve en güncel güvenlik standartlarına uygun bir şekilde hareket edilmelidir.