İlan
06 Haz 2026 18 çevrimiçi üye Duyurular
Ana Sayfa Web Geliştirme
Ana Sayfa Forum Web Geliştirme PHP 8 ile Verilerinizi Zırhlayın: Kriptografi ve G...
İlan Yan banner placeholder

PHP 8 ile Verilerinizi Zırhlayın: Kriptografi ve Güvenli Veri İşleme

Bydesen 05.05.2026 00:42 531 görüntüleme 4 cevap
Son Mesaj
Bydesen
Üye
Üye
Katılım30 Kas 2025
Konular5
Mesajlar52
Elmas Konular0
Başarım0
ZirveCoin 0
Ticaret Puanı
+0 -0
05.05.2026 00:42 #1

PHP 8 ile Verilerinizi Zırhlayın: Kriptografi ve Güvenli Veri İşleme​


Modern web uygulamalarında kullanıcı verisini işlemek, ateşle oynamak gibidir. Kullanıcının şifresini, kişisel bilgilerini veya ödeme detaylarını korumak, bir geliştiricinin en kutsal görevidir. PHP 8, bu "dijital kasayı" güvenli bir şekilde yönetmemiz için bize güçlü kriptografi araçları sunar.

Gelin, verilerimizi nasıl şifreleyeceğimize, şifreleri nasıl saklayacağımıza ve sırlarımızı nasıl koruyacağımıza bakalım.

1. Kural 1: Şifreler ASLA Düz Metin Saklanmaz (Password Hashing)​

Bu kuralın bir istisnası yok. Kullanıcı şifresini veritabanına 123456 diye yazmak, o veritabanını çaldırdığınız an tüm kullanıcılarınızı satmak demektir.

Şifreler "hash"lenir. Hash, tek yönlü bir işlemdir; geri döndürülemez. PHP 8'de bu işin tek bir doğrusu var: password_hash ve password_verify.

php:
// Şifreyi veritabanına kaydederken:
$password = 'kullanici_sifresi_123';
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
// $hashedPassword'ı veritabanına kaydet.

// ---

// Kullanıcı giriş yaparken:
$userInput = 'giriş_denemesi_123';
if (password_verify($userInput, $hashedPassword)) {
    // Şifre doğru, giriş başarılı
} else {
    // Şifre yanlış
}

Neden PASSWORD_DEFAULT?Bu sihirli sabit, PHP'nin gelecekte daha güçlü bir hash algoritması (örn: Argon2) çıkarması durumunda, kodunuzun otomatik olarak o en güvenli algoritmaya geçmesini sağlar.

2. Şifreleme (Encryption): Geri Çözülmesi Gereken Veriler​

Şifreler hash'lenir, çünkü onları geri getirmeye ihtiyacımız yoktur.

Ancak kullanıcının API anahtarı, ödeme bilgisi veya kişisel mesajı gibi geri çözülmesi gereken hassas veriler "şifrelenir" (encrypt edilir).

Bunun için PHP'nin openssl eklentisini kullanırız:

php:
$data = 'çok_gizli_veri';
$key = 'sadece_sunucunun_bildiği_güvenli_bir_anahtar';
$iv = random_bytes(16); // Her seferinde farklı olmalı

// Şifrele
$encryptedData = openssl_encrypt($data, 'AES-256-CBC', $key, 0, $iv);

// Geri Çöz
$decryptedData = openssl_decrypt($encryptedData, 'AES-256-CBC', $key, 0, $iv);

(Not: Asimetrik şifreleme, yani Public/Private Key işlemleri için openssl_public_encrypt gibi fonksiyonlar da mevcuttur.)

3. Güvenli Rastgelelik: random_bytes()​

Güvenlikte "tahmin edilebilirlik" ölümdür. Oturum token'ı, şifre sıfırlama linki veya şifreleme anahtarı ($iv) oluştururken asla rand() veya mt_rand() kullanmayın. Bunlar kriptografik olarak güvenli değildir.

Doğru yöntem:

php:
// Kriptografik olarak güvenli 32 byte'lık rastgele veri üret
$secureToken = random_bytes(32);

// Bunu hex'e çevirerek harika bir API key yapabilirsiniz:
$apiKey = bin2hex($secureToken);

4. Sırları Saklamak (API Keyler, Veritabanı Şifreleri)​

Veritabanı şifreniz, API anahtarlarınız kodun içinde (config.php) düz metin olarak mı duruyor? Bu, büyük bir risktir. PHP'nin modern sodium eklentisi (PHP 7.2'den beri çekirdekte var) bunun için harika bir "kasa" sunar:

php:
$secretKey = 'sunucunuzdaki_ana_anahtar';
$message = 'korunacak_hassas_veri';
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES); // Tek kullanımlık

// Kasa Kutusuna Kilitle
$encryptedMessage = sodium_crypto_secretbox($message, $nonce, $secretKey);

// Kutudan Çıkar
$decryptedMessage = sodium_crypto_secretbox_open($encryptedMessage, $nonce, $secretKey);

5. Diğer Hayati Güvenlik Adımları (Hızlı Kontrol Listesi)​

Kriptografi tek başına yetmez, bu adımlar da hayati önem taşır:
  • Güvenli Çerezler: Bir önceki konudan hatırlayacağımız gibi, setcookie() yaparken secure: true, httponly: true ve samesite: 'Strict' bayraklarını mutlaka kullanın.
  • Veri Temizleme (SQL Injection): Veritabanı ile konuşurken her zaman PDO ve parametreli sorgular (prepared statements) kullanın. Bu, SQL Injection'ı %99 engeller.
    php:
    $stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");
    $stmt->bindParam(':username', $userInput, PDO::PARAM_STR);
    $stmt->execute();

    Güvenli Dosya Yükleme: Kullanıcıdan dosya alıyorsanız:

    1. Dosya tipini ve boyutunu mutlaka sunucu tarafında doğrulayın (sadece uzantıya güvenmeyin).
    2. Yüklenen dosyayı web root dizininin dışına (örn: public_html klasörünün bir üstüne) kaydedin.
    3. Dosyaya random_bytes ile oluşturulmuş benzersiz bir isim verin.
  • Güvenlik Denetimleri: Kodunuzu düzenli olarak denetleyin ve composer update komutuyla tüm kütüphanelerinizi güncel tutun.
Güvenlik, bir özellik değil, bir zihniyettir.
Bydesen
Üye
Üye
Katılım30 Kas 2025
Konular5
Mesajlar52
Elmas Konular0
Başarım0
ZirveCoin 0
Ticaret Puanı
+0 -0
05.05.2026 02:37 #2
Paylaşım için teşekkürler
Teselli
erenagar
Üye
Üye
Katılım17 Nis 2026
Konular12
Mesajlar64
Elmas Konular0
Başarım0
ZirveCoin 0
Ticaret Puanı
+0 -0
05.05.2026 12:44 #3
Paylaşım için teşekkürler
Muhammed63
Üye
Üye
Katılım04 Nis 2026
Konular11
Mesajlar66
Elmas Konular0
Başarım0
ZirveCoin 0
Ticaret Puanı
+0 -0
05.05.2026 16:29 #4
Paylaşım için teşekkürler.
HenryDocker
Üye
Üye
Katılım24 Oca 2026
Konular7
Mesajlar55
Elmas Konular0
Başarım0
ZirveCoin 0
Ticaret Puanı
+0 -0
05.05.2026 19:39 #5
Eline sağlık! Paylaşım için teşekkürler.
Bu konuyu görüntüleyenler
1 misafir
Cevap yazmak için giriş yapın.
İlan Yan banner placeholder