Konuyu Açan
#1
Giriş
Birçok PHP projesinde sayfalama (pagination) kullanımı, kullanıcı girdisine bağlı olarak LIMIT ve OFFSET değerlerini üretir. Ancak bu süreçte güvenlik hataları kolayca ortaya çıkabilir: SQL enjeksiyonu riskleri, yanlış kullanıcı yetkisi kontrolü, ve toleranssız hata mesajları. Aşağıda güvenli sayfalama tasarımını adım adım ele alıyorum; kendi projelerinizde hangi noktaları kontrol ettiğinizi görmek isterim.
[b]1) Girdi doğrulama ve tip güvenliği
- Sayfalama için kullanılan sayfa numarası genelde $_GET['sayfa'] veya limit’imizi belirleyen parametreler olarak geliyor. Bunları önce integer’a çevirin ve minimum değerleri zorunlu kılın: $sayfa = max(1, (int)($_GET['sayfa'] ?? 1)); $limit = max(10, min(100, (int)($_GET['limit'] ?? 20))); Böylece zararlı veya çok büyük sayılar verinin sorguya yansımasını engelleriz.
- Mantıksal sınırlar: toplam sayfa sayısı bilinmiyorsa dinamik olarak hesaplanır; ancak 1 ile 1000 gibi makul üst sınırlar koyun veya toplam kayıt sayısını bağımsız bir kez hesaplayıp buna göre validasyon yapın.
[b]2) SQL enjeksiyonuna karşı güvenli sorgular
- Hazard: doğrudan değişkenleri SQL stringine gömmeden, hazırlanan ifadeler ve bağlamalar (prepared statements) kullanın.
- Örnek yaklaşım:
- SELECT COUNT(*) FROM posts WHERE published = 1; ile toplam kayıt sayısını alın.
- Daha sonra sayfalama için: SELECT id, title FROM posts WHERE published = 1 ORDER BY created_at DESC LIMIT ? OFFSET ?; ve LIMIT/OFFSET değerlerini bağlayın (örn. PDO ile bindValue).
- LIMIT/OFFSET için parametrik bağlama destekleyen sürümleri kullanın; bazı sürümlerde bu değerler doğrudan tamsayı olarak bağlanmalıdır; ayrıca uygulama katmanında bu değerlerin integer olduğundan emin olun.
[b]3) Performans ve güvenlik dengesi
- Toplam kayıt sayısını bir kez hesaplayıp, geçerli sayfa ve sayfa başına gösterilecek kayıt sayısını dinamik olarak güncelleyin.
- Büyük sayfalama durumlarında OFFSET yerine anahtarı takip eden sayfalama (keyset pagination) düşünün; bu yöntemle performans iyileşebilir ve güvenliğin de artması muhtemeldir.
- Dizin kullanımı: sorgularınızda WHERE ve ORDER BY için uygun indeksler olduğundan emin olun; böylece sayfalama performansı düşmez.
[b]4) Hata gösterimi ve kullanıcıya güvenlik
- Hataları kullanıcıya direkt sormayın; exception mesajları veya debug info üretmeyin. Genel hata mesajları ve sunucu tarafı loglar arasındaki ayrımı net tutun.
- Giriş verileri üzerinde doğrulama başarısızsa 400/422 yanıtı üretin ve girişleri temizleyin.
[b]5) Güvenli çıktı ve kullanıcı deneyimi
- Sayfa linklerinde doğru aktif sayfa işaretini gösterin; limit ve sayfa parametrelerini güvenli biçimde yeniden oluşturun.
- Aşırı çok sayfalamanın kullanıcı deneyimini bozmasını engelleyin; toplam sayfa sayısını gösterirken yalnızca hedeflenen aralıkları sunun.
[/quote]
Sayfalama güvenliğiyle ilgili deneyimlerinizi ve karşılaştığınız somut senaryoları paylaşır mısınız? Özellikle hangi veritabanı sürümüyle çalışırken, hangi sürümde güvenli sayfalama için tercih ettiğiniz teknikleri kullanıyorsunuz?
