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?

Yanıt vermek için giriş yapmış olmalısınız.

0 alıntı seçildi