Veritabanı güvenliği, bir web uygulamasının en kritik bileşenlerinden biridir. PHP ile veritabanı güvenliği sağlamak için SQL Injection önleme, parola güvenliği, erişim kontrolleri ve CSRF koruması gibi yöntemler uygulamalısınız.
Veritabanı güvenliğini sağlamak için aşağıdaki örneklendirdiğim yöntemleri kullanabilirsiniz.
1. SQL Injection Önleme
SQL Injection saldırıları, kötü niyetli kullanıcıların SQL sorgularını manipüle ederek veritabanına yetkisiz erişim sağlamasına yol açabilir. Hazırlıklı (Prepared) SQL ifadeleri kullanarak bu saldırıları önleyebiliriz.
1.1 Hatalı Kullanım (Tehlikeli!)
$user_id = $_GET['id'];
$query = "SELECT * FROM users WHERE id = $user_id";
$result = $db->query($query);
Bu kullanım güvenli değildir çünkü doğrudan kullanıcı girişine dayanmaktadır. Eğer saldırgan şu tür bir giriş yaparsa:
?id=1 OR 1=1 --
Tüm kullanıcı verileri görüntülenebilir.
1.2 Güvenli Kullanım (PDO ile Prepared Statements)
$user_id = $_GET['id'];
$query = "SELECT * FROM users WHERE id = :id";
$stmt = $db->prepare($query);
$stmt->bindParam(':id', $user_id, PDO::PARAM_INT);
$stmt->execute();
$result = $stmt->fetch(PDO::FETCH_ASSOC);
Bu yöntem, SQL Injection saldırılarını önler.
2. Kullanıcı Girdilerini Doğrulama ve Filtreleme
Kullanıcılardan gelen verileri filtrelemek, kötü niyetli girişleri önlemek için gereklidir.
2.1 E-posta Adresi Doğrulama
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
if (!$email) {
die("Geçersiz e-posta adresi!");
}
2.2 XSS (Cross-Site Scripting) Önleme
$safe_input = htmlspecialchars($_POST['input'], ENT_QUOTES, 'UTF-8');
Bu, zararlı HTML ve JavaScript girişlerini engeller.
3. Parola Güvenliği ve Hashleme
Parolaları asla düz metin olarak saklamayın! bcrypt veya argon2 gibi güçlü şifreleme algoritmaları kullanın.
3.1 Parola Hashleme
$hashed_password = password_hash($password, PASSWORD_DEFAULT);
3.2 Parola Doğrulama
if (password_verify($password, $hashed_password)) {
echo "Giriş başarılı";
} else {
echo "Hatalı parola";
}
4. Yetkilendirme ve Erişim Kontrolleri
Kullanıcıların yetkilendirilmiş sayfalara erişmesini sağlamak için oturum kontrolleri yapmalıyız.
4.1 Oturum Kontrolü
session_start();
if (!isset($_SESSION['user_id'])) {
header("Location: login.php");
exit;
}
4.2 RBAC (Role-Based Access Control) Kullanımı
if ($_SESSION['role'] !== 'admin') {
die("Erişim izniniz yok!");
}
5. Güvenli Veritabanı Bağlantısı
Veritabanı bağlantısının güvenli olması kritik önem taşır.
try {
$db = new PDO("mysql:host=localhost;dbname=testdb;charset=utf8", "root", "", [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
} catch (PDOException $e) {
error_log($e->getMessage());
die("Veritabanı bağlantı hatası!");
}
Önemli: error_log($e->getMessage())
ile hataları log dosyasına yazdırın, ekrana basmayın!
6. Veritabanı İzinlerini Kısıtlama
Veritabanı kullanıcılarına minimum yetki vererek güvenliği artırabilirsiniz.
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'strongpassword';
GRANT SELECT, INSERT, UPDATE ON testdb.* TO 'appuser'@'localhost';
7. CSRF (Cross-Site Request Forgery) Koruması
CSRF saldırılarını önlemek için her form işleminde CSRF token kullanın.
7.1 CSRF Token Oluşturma
session_start();
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
7.2 Form Kullanımı
<form method="POST">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
<button type="submit">Gönder</button>
</form>
7.3 Token Doğrulama
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die("Geçersiz CSRF token!");
}
8. Veritabanı Yedekleme ve İzleme
Düzenli olarak veritabanı yedeği alarak olası veri kayıplarını önleyin.
mysqldump -u root -p testdb > backup.sql
Yedekleri şifreleyerek saklayın:
gzip -c backup.sql | openssl enc -aes-256-cbc -e -out backup.sql.gz
9. HTTPS Kullanımı
Hassas verilerin iletimi sırasında HTTPS kullanmak zorunludur. Sunucunuza SSL sertifikası yükleyerek tüm verilerin şifreli iletilmesini sağlayın.
<VirtualHost *:80>
Redirect permanent / https://yourdomain.com/
</VirtualHost>