Konuyu Açan #1
Giriş

Birçok PHP uygulamasında sıralama (ORDER BY) parametreleri kullanıcı tarafından dinamik olarak belirleniyor. Bu durum, SQL enjeksiyonu riskini artırıyor çünkü çoğu geliştirici değeri doğrudan bir değişkende kullanıp hazırlama ifadeleriyle (prepared statements) güvenliğini göz ardı ediyor. Burada temel endişe, bir dış kaynaktan alınan sıralama sütunu veya yöndeki parametrelerin güvenli şekilde doğrulanmamasıdır.

  • Yapılandırılmış ifadeler yeterli mi?
    Aslında çoğu sürümde prepared statements sadece veri değerlerini parametre olarak güvenli kılar. ORDER BY gibi yerlerde sütun adları veya yön (ASC/DESC) gibi yapısal parçalar için bind parametreler kullanılamaz. Bu nedenle, dinamik SQL üretiminde kullanıcı girdisini doğrudan kullanmak risklidir.
  • Sütun adlarını beyaz listeyle sınırlama
    En güvenli yaklaşım, kullanıcı girdisini doğrudan kabul etmek yerine bir beyaz liste oluşturmak ve her değeri bu listeden eşleşen bir sütun adıyla eşleştirmektir. Örneğin, kullanıcı hangi sütuna göre sıralama yapacağını seçerse, yalnızca önceden tanımlı sütun adlarına izin verin.
  • Yön parametresi için doğrulama
    ORDER BY içinde yön (ASC, DESC) da kullanıcıdan gelebilir. Bu durumda yönü daima sabit bir küme ile sınırlayın ve kullanıcının girdiğini bu küme ile karşılaştırarak güvenli yön değerini alın.
  • Kod örneği yaklaşımı
    $validColumns = ['name','created_at','price'];
    $sort = $_GET['sort'] ?? 'name';
    $dir = strtoupper($_GET['dir'] ?? 'ASC');
    if (!in_array($sort, $validColumns, true)) { $sort = 'name'; }
    if (!in_array($dir, ['ASC','DESC'], true)) { $dir = 'ASC'; }
    $sql = "SELECT * FROM products ORDER BY $sort $dir LIMIT 100";
  • Veritabanı bağımsızlık ve performans
    Sıralama alanını dinamik olarak değişmek, indeks kullanımını etkileyebilir. Özellikle büyük tablolar için mevcut indekslerin hangi sütunları kapsadığını kontrol etmek, sık sorgu kalıplarında performansı korumaya yardımcı olur.
  • Diğer güvenlik önlemleri
    • Girdi doğrulama ve giriş temizleme
    • Hatalı yön/alan kombinasyonlarında kullanıcıya güvenli hata mesajı vermek
    • En yakın güvenlik ilkesi: en az ayrıcalıkla çalışmak ve erişim denetimini sıkı tutmak


Sık karşılaşılan hatalar

  • Kullanıcı girdisini direkt SQL ifadesinde sütun adı olarak kullanma
  • Bind parameterlerin sadece değerlerle sınırlı olduğunu unutma
  • Hatalı beyaz liste veya eksik doğrulama nedeniyle enjeksiyon riskinin kapanmaması


Görüş ve deneyimleriniz var mı? Sıralama parametrelerinde güvenliği güçlendirmek için kullandığınız özel stratejiler veya karşılaştığınız zorluklar nelerdir?

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

0 alıntı seçildi