Yukarudaki örneklerden saldırganın veri tabanı şeması hakkında bir bilgiye sahip olması gerektiği savını ileri sürebilirsiniz. Savınız doğrudur. Ama ne zaman ve nasıl olduğunu bilmezsiniz. Bildiğinizde de veri tabanınız açılmıştır. Açık kaynak kodlama kullanıyorsanız ya da halka açık veri tabanı paketi kullanıyorsanız onun içerik yönetim sistemi ya da bir forumu vardır. Davetsiz misafirler sizin kodunuzun bir kopyasını alırlar. Eğer zayıf bir tasarımı varsa aynı zaman bu bir güvenlik riski oluşturur.
Bu saldırılar güvenlik dikkate alınmadan yapılan kodlamaları temel alırlar. Herhangi bir girişe güvenmeyin. Özellikle istemci tarafından gelen koda... Bir seçenek kutusundan gelse, gizli giriş analanı olsa ya da çerek olsa bile güvenmeyin. İlk örnekte görüldüğü gibi bu tür saçma bir sorgu yıkıntıya neden olabilir.
Veri tabanına süper kullanıcı olarak ya da veri tabanı sahibi olarak bağlanmayın. Her zaman sınırlı yetkileri olan kişiselleştirilmiş kullanıcılarla işlem yapın.
Sunulan giiriş bilgisinin istenen veri tipinde olduğunu denetleyin. PHP içinde giriş denetimi için pek çok denetim işlevi vardır. Değişken işlevlerindeki ve karakter tipi işlevlerdeki en basitlerinden (is_numeric(), ctype_digit() gibi), Perl uyumlu kurallı deyimlere kadarını destekler işlevler vardır.
Eğer uygulama sayısal giriş bekliyorsa, veriyi is_numeric() ile denetlemeye çalışın. Ya da türünü settype() kullanarak değiştirin, ya da sprintf() kullanarak onun sayısal değerini alın.
Listelemek için daha güvenli bir sorgulama yapma yolu
<?php
settype($offset, 'integer');
$query = "SELECT id, name FROM products
ORDER BY name LIMIT 20 OFFSET $offset;";
// aşağıda %d kullanımına dikkat edin. Burada %s kullanmak çok anlamsızdır
$query = sprintf("SELECT id, name FROM products
ORDER BY name LIMIT 20 OFFSET %d;", $offset);
?>
Sayısal olmayan kullanıcının sunduğu değerleri veri tabanına özel yazı dizisi atlatma işlevi (escape function) kullanarak alın (örneğin mysql_escape_string(), sql_escape_string() vb.). Eğer veri tabanı atlatma işlevi yoksa, örneklerde görüldüğü gibi sorgulamanın değişmez bölümlerinde tırnak işaretleri eklemek yeterli değildir. Bu yöntem sorgulamayı çok kolay kırılır yapar...
Veri tabanına özel hiçbir şeyi yazdırmayın. Özellikle şemayı. Hata yadırma ve Hatayı ele alma ve log yazdırma işlevlerine de bakın.
Saklanan yordamları kullanabilirsiniz ve veriyi özetleyen önceden tanımlanmış imleçler (cursor) kullanabilirsiniz. Bu durumda doğrudan tablolara ya da görüntülere (views) doğrudan erişmeniz gerekmez. Ama bu çözümünde başka etki ortaya çıkar.
Bunların dışında, ister sizin kodlamanızdan ya da veri tabanının kendisinden sorguların log kayıtlarını kullanma olanağı vardır. Doğal olarak log'lar zararlı saldırıları önlemez. Tuzağa düşürülen uygulamanda olayın nasıl olduğunu geriye dönük tarama amcıyla izleyebilirsiniz. Bu nedenle log kendi başına bir anlam kazandırmaz. Ama içeriğindeki bilgiyle sorunu bulmaya yarar. Hiç yoktan da iyidir.