Gereksinimler ve Ön Hazırlık
Sistemi kurmadan önce geliştirme ortamınızın belirli standartları karşıladığından emin olmalısınız. Dinamik QR kod üretimi ve doğrulaması için aşağıdaki araçlara ihtiyacınız olacak:
- PHP 8.3 veya üzeri: Güncel güvenlik yamaları ve performans iyileştirmeleri için gereklidir.
- Composer: PHP paket yöneticisi. QR kod oluşturmak için
bacon/bacon-qr-codekütüphanesini kullanacağız. - Veritabanı: Kullanıcı oturumlarını ve geçici QR tokenlarını saklamak için MySQL veya MariaDB.
- SSL/TLS Sertifikası: QR kod tabanlı işlemlerin güvenliği için sunucunuzun HTTPS üzerinden çalışması zorunludur.
Öncelikle projenizin kök dizininde terminali açarak gerekli kütüphaneyi yükleyin:
composer require bacon/bacon-qr-code
Adım 1: Veritabanı Yapısını Oluşturma
Dinamik giriş sisteminin temelinde, her giriş denemesi için oluşturulan geçici ve tek kullanımlık tokenlar yatar. Bu tokenları saklamak için bir tabloya ihtiyacımız var.
CREATE TABLE qr_sessions (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
token VARCHAR(255) NOT NULL,
expires_at DATETIME NOT NULL,
is_used TINYINT(1) DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Bu tablo, QR kodun içeriğini oluşturan benzersiz tokenı ve bu tokenın geçerlilik süresini tutar. is_used sütunu, QR kod bir kez tarandıktan sonra tekrar kullanılmasını engellemek için kritik öneme sahiptir.
Adım 2: Dinamik QR Kod Oluşturma
Kullanıcı giriş sayfasına geldiğinde, sunucu tarafında benzersiz bir token üretilmeli ve bu token QR koda dönüştürülmelidir. Aşağıdaki PHP kodu, güvenli bir token oluşturur ve bunu QR kod olarak ekrana basar.
Bu kodda random_bytes(32) fonksiyonunu kullanarak kriptografik olarak güvenli bir dizi oluşturduk. Bu token, veritabanına kaydedilir ve kullanıcı tarayıcıda QR kodu görür.
Adım 3: QR Kod Tarama ve Doğrulama Mantığı
Mobil cihazdan QR kod tarandığında, uygulama sunucuya bu tokenı gönderir. Sunucu, veritabanındaki token ile gelen veriyi karşılaştırır. İşte bu doğrulama işlemini yapan temel PHP mantığı:
Bu aşamada is_used değerini 1 yaparak, aynı QR kodun ikinci kez kullanılmasını engellemiş olduk. Bu, "Replay Attack" (tekrar oynatma saldırısı) olarak bilinen güvenlik zafiyetine karşı en etkili yöntemdir.
QR Kod Tabanlı Sistemlerin Karşılaştırmalı Analizi
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| Statik QR | Kolay kurulum | Güvenlik riski yüksek |
| Dinamik QR (Tokenlı) | Yüksek güvenlik | Veritabanı yükü |
| TOTP + QR | Endüstri standardı | Mobil uygulama gerektirir |
Adım 4: Güvenlik Uyarıları ve En İyi Pratikler
Sisteminizi canlıya almadan önce aşağıdaki güvenlik önlemlerini mutlaka gözden geçirin. Yazılım güvenliği, sadece kodu yazmak değil, olası saldırı vektörlerini tahmin etmektir.
Kritik Güvenlik Uyarısı: QR kod içeriğinde asla kullanıcı şifresi veya hassas kişisel veriler taşımayın. Sadece sunucuda eşleşen rastgele bir token (UUID) kullanın. Tüm iletişim HTTPS üzerinden yapılmalıdır; aksi takdirde tokenlar "Man-in-the-Middle" saldırılarıyla çalınabilir.
Yaygın hatalardan biri, QR kodun geçerlilik süresini çok uzun tutmaktır. Geçerlilik süresini (TTL - Time To Live) en fazla 30-60 saniye ile sınırlayın.
Sıkça Sorulan Sorular
QR kodun süresi dolduğunda ne yapmalıyım?
JavaScript kullanarak 30 saniyede bir sayfayı yenileyen veya yeni bir token talep eden bir AJAX döngüsü kurmalısınız. Bu sayede kullanıcı QR kodu tarayamadan süre dolarsa otomatik olarak yeni bir kod üretilir.
Veritabanı performansı nasıl korunur?
Eski ve kullanılmış QR oturumlarını temizlemek için bir "cron job" veya düzenli çalışan bir temizleme scripti yazarak qr_sessions tablosunun şişmesini engelleyin.
Mobil uygulamam yok, nasıl giriş yapabilirim?
Kullanıcının telefonundaki herhangi bir QR kod okuyucu, tarayıcıyı tetikleyerek web üzerinden giriş yapmasını sağlayabilir. Uygulama zorunlu değildir.
Token çalınırsa ne olur?
Tokenlar tek kullanımlıktır. Eğer saldırgan tokenı çalarsa, token zaten kullanılmış olacağı için sistem erişim reddedecektir.
Hangi kütüphaneyi kullanmalıyım?
PHP dünyasında bacon/bacon-qr-code veya endroid/qr-code en kararlı ve güncel seçeneklerdir.
Sistem Performansını Optimize Etme ve Ölçeklendirme
Dinamik QR kod sistemleri, özellikle yüksek trafikli uygulamalarda veritabanı üzerinde ciddi bir yük oluşturabilir. Her QR kod oluşturma isteği, veritabanına yeni bir kayıt eklenmesine veya mevcut bir kaydın güncellenmesine neden olur. Bu yükü yönetmek için aşağıdaki stratejileri uygulayabilirsiniz:
Redis ile Token Yönetimi
Token tabanlı doğrulama süreçlerinde veritabanı yerine Redis gibi bir bellek içi (in-memory) veri deposu kullanmak, sorgu süresini milisaniyeler seviyesine indirir. QR kodun geçerlilik süresini (TTL) doğrudan Redis üzerinden yönetmek, veritabanı temizleme (garbage collection) ihtiyacını ortadan kaldırır.
// Redis kullanarak geçici token oluşturma örneği
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$token = bin2hex(random_bytes(32));
$redis->setex("qr_session:$token", 60, json_encode(['user_id' => $userId]));
// Yukarıdaki kod, token'ı 60 saniye boyunca bellekte tutar ve otomatik siler.
Veritabanı İndeksleme Stratejileri
Eğer Redis kullanma imkanınız yoksa, veritabanındaki tokens tablonuzda mutlaka created_at ve is_used sütunlarına indeks eklemelisiniz. Bu, süresi dolmuş tokenları temizleyen cron job işlemlerinizin çok daha hızlı çalışmasını sağlar.
Sistem Hata Ayıklama ve Loglama
QR kod sistemlerinde hata ayıklama süreci, istemci (mobil cihaz) ve sunucu arasındaki iletişim kopuklukları nedeniyle zorlayıcı olabilir. Sistemin sağlıklı çalıştığından emin olmak için şu loglama adımlarını izleyin:
- Token Eşleşmeme Hataları: Kullanıcının taradığı token ile veritabanındaki token uyuşmadığında, hata loglarına cihazın IP adresini ve tarayıcı bilgisini kaydedin.
- Zaman Aşımı Kontrolü: QR kodun oluşturulma zamanı ile taranma zamanı arasındaki farkı (latency) loglayarak, ağ gecikmelerini analiz edin.
- Başarısız Deneme Sayacı: Belirli bir IP adresinden gelen ardışık hatalı tarama isteklerini tespit ederek, kaba kuvvet (brute-force) saldırılarını önlemek için geçici bloklama mekanizmaları kurun.
// Hata loglama örneği
if ($token !== $dbToken) {
error_log("Geçersiz QR tarama denemesi: " . $_SERVER['REMOTE_ADDR'] . " - Zaman: " . date('Y-m-d H:i:s'));
http_response_code(403);
exit('Geçersiz veya süresi dolmuş QR kod.');
}
İleri Düzey Güvenlik İpuçları
Sisteminizi daha dayanıklı hale getirmek için şu ek önlemleri göz önünde bulundurun:
- SSL/TLS Zorunluluğu: QR kod verisi asla açık metin (plain text) olarak iletilmemelidir. HTTPS kullanımı bir seçenek değil, zorunluluktur.
- Cihaz Parmak İzi (Device Fingerprinting): QR kodu oluşturan tarayıcı ile kodu onaylayan cihazın benzer ağ veya cihaz özelliklerine sahip olup olmadığını kontrol ederek "Man-in-the-Middle" saldırılarını zorlaştırın.
- Payload Şifreleme: QR kodun içine gömülen veriyi basit bir base64 yerine, sunucu tarafında şifrelenmiş (AES-256) bir string olarak saklayın.
Sonuç
Php ile Qr kod tabanlı dinamik giriş sistemi yapmak, kullanıcılarınız için hem modern hem de güvenli bir kimlik doğrulama süreci sağlar. Bu rehberde, token tabanlı bir doğrulama mekanizmasının temellerini attık. Bir sonraki adımda, bu sistemi 2FA (İki Faktörlü Doğrulama) ile birleştirerek giriş sürecini daha da güçlendirebilirsiniz. Unutmayın, güvenlik bir varış noktası değil, sürekli bir süreçtir.
Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Üretim ortamında (production) kullanmadan önce, kodunuzu profesyonel güvenlik testlerinden geçirin ve güncel güvenlik kütüphanelerini kullanmaya devam edin.


Yorumlar (0)
Yorum Yaz