PHP ile Veritabanı Güvenliği

PHP ile Veritabanı Güvenliği

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>

 

Yorum gönder

This site uses Akismet to reduce spam. Learn how your comment data is processed.