2011-05-11 31 views
5

Şu anda C# ve LINQ-TO-SQL ile bir proje yapıyorum. Bu projenin güvenliği yüksek önceliklidir, bu yüzden SQL-Enjections'ı engellemek istiyorum. Konuya dikkat ettim, ama işe yaramadı. Microsoft'un kendi SSS'si, LINQ'un parametreleri işleme biçiminden dolayı, LINQ kodunun bir hata ayıklayıcısında üretildiğini ve LINQ-To-SQL'in yalnızca SQL'e nasıl bağlandığı hakkında biraz bilgi sahibi olmasından dolayı, Enjeksiyonların sorun olmayacağını söyledi. bunun nasıl uygulandığından emin olabilirsiniz.LINQ-To-SQL, SQL Enjeksiyonlarını nasıl önler?

Bu konuyla ilgilenen herhangi bir literatür/bağlantı var mı?

cevap

6

Linq otomatik SQLParameters kullanır SQL

var sql = "SELECT * FROM [dbo].[Orders] WHERE [CustomerName] = @name"; 

(ve name gelen değere sahip bir parametre @name ekleyin): Elbette çok doğru yukarıdaki parametre cinsinden olabilir. Kullanıcı girişi, sadece birleştirilmiş bir dizge olmak yerine, parametre değerlerine çevrilir (SQL enjeksiyonlarına izin verir). Bu serveride, IIRC olur, bu yüzden sadece istemci taraf kodunu görüyorsunuz. Biraz daha arka plan ve bilgi istiyorsanız, the information here'u okuyabilirsiniz.

+0

Tamam, makalenin 2. sayfası sorumu silindi. Cevabınız için teşekkür ederim! – fk2

6

Oldukça basit, gerçekten - çeviri onları parametrelendirmeden değişkenleri hiçbir zaman enjekte etmez; böylece:

var orders = from ord in ctx.Orders 
      where ord.CustomerName = name 
      select ord; 

hale gelecektir: p0 daha fazla name

yakalanan şey, hiçbir şey az alınan değere sahip bir parametredir

SELECT * FROM [dbo].[Orders] WHERE [CustomerName] = @p0 

. Ancak bu, enjeksiyon saldırılarını önler. Bir yanlış kazara için Kontrast: büyük riskler getirmektedir

var sql = "SELECT * FROM [dbo].[Orders] WHERE [CustomerName] = '" + name + "'"; 

.

+0

Ne kadar? Dize içeren bir giriş alanım olduğunu varsayalım. Birisi "; Veritabanına Bırak" ya da benzer bir şeye girer. Bu, SELECT * FROM [Orders] WHERE [CustomerId] =; Veritabanı Bırak ”olarak değerlendirir. O zaman sorunum yok mu? – fk2

+0

@ fk2, Parametreli sql anladığını sanmıyorum ... – canon

+1

@ fk2 '@ p0' *** bir parametredir ***; TSQL olarak asla değerlendirilmez; Bu herhangi bir dize içeriği, herhangi bir risk olmadan –