Burada, kodumuzda parametrize sql sorgularının kullanılmasıyla ilgili başka bir tartışma yapıyoruz. Tartışmada iki tarafımız var: Ben ve diğerleri, sql enjeksiyonlarına karşı koruma sağlamak için her zaman parametreleri kullanmamız gerektiğini söyleyenler ve gerekli olmadığını düşünen diğer kişiler. Bunun yerine, sql enjeksiyonlarını önlemek için tek kesme işaretini tüm dizelerde iki kesme işaretiyle değiştirmek istiyorlar. Veritabanlarımızın tümü Sql Server 2005 veya 2008 ile çalışıyor ve kod tabanımız .NET framework 2.0 üzerinde çalışıyor.
C # ile size basit bir örnek vereyim:
Bunu kullanmamızı istiyorum:
string sql = "SELECT * FROM Users WHERE Name=@name";
SqlCommand getUser = new SqlCommand(sql, connection);
getUser.Parameters.AddWithValue("@name", userName);
//... blabla - do something here, this is safe
Diğerleri bunu yapmak isterken:
string sql = "SELECT * FROM Users WHERE Name=" + SafeDBString(name);
SqlCommand getUser = new SqlCommand(sql, connection);
//... blabla - are we safe now?
SafeDBString işlevi aşağıdaki gibi tanımlandığında:
string SafeDBString(string inputValue)
{
return "'" + inputValue.Replace("'", "''") + "'";
}
Şimdi, sorgularımızdaki tüm string değerlerinde SafeDBString kullandığımız sürece güvende olmalıyız. Sağ?
SafeDBString işlevini kullanmanın iki nedeni vardır. Birincisi, taş eskidiğinden beri yapılan budur ve ikincisi, veritabanında çalıştırılan tam sorguyu gördüğünüz için sql ifadelerinde hata ayıklamak daha kolaydır.
E sonra. Sorum, sql enjeksiyon saldırılarını önlemek için SafeDBString işlevini kullanmanın gerçekten yeterli olup olmadığıdır. Bu güvenlik önlemini bozan kod örnekleri bulmaya çalışıyordum, ancak hiçbir örneğini bulamıyorum.
Bunu kırabilecek kimse var mı? Nasıl yapardın?
DÜZENLEME: Şimdiye kadarki cevapları özetlemek gerekirse:
- Henüz kimse Sql Server 2005 veya 2008'de SafeDBString'i aşmanın bir yolunu bulamadı. Sanırım bu iyi mi?
- Birkaç yanıt, parametreleştirilmiş sorgular kullandığınızda bir performans kazancı elde ettiğinizi belirtti. Bunun nedeni, sorgu planlarının yeniden kullanılabilmesidir.
- Ayrıca parametreleştirilmiş sorguları kullanmanın, bakımı daha kolay olan daha okunabilir kodlar verdiğini kabul ediyoruz.
- Dahası, parametreleri kullanmak, SafeDBString'in çeşitli sürümlerini, diziden numaraya dönüştürmeleri ve tarihe kadar dönüştürmeleri kullanmaktan daha kolaydır.
- Parametreleri kullanarak otomatik tür dönüşümü elde edersiniz, bu özellikle tarihlerle veya ondalık sayılarla çalışırken yararlı olan bir şeydir.
- Ve son olarak: JulianR'ın yazdığı gibi güvenliği kendiniz yapmaya çalışmayın . Veritabanı satıcıları güvenlik için çok fazla zaman ve para harcıyor. Daha iyisini yapabilmemizin hiçbir yolu yok ve işlerini yapmaya çalışmamız için hiçbir neden yok.
Bu nedenle, SafeDBString işlevinin basit güvenliğini kimse kıramasa da birçok başka iyi argüman aldım. Teşekkürler!