2011-01-12 20 views
5

, bu kullanıyorum kodudur:, parametreleri ile dinamik SQL kullanarak güvenli midir? Değilse, hangi güvenlik sorunlarına maruz kalabilir? Örneğin

String commandString = "UPDATE Members SET UserName = @newName , AdminLevel = @userLevel WHERE UserID = @userid"; 
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["sqlconnectionstring"].ConnectionString)) 
{ 
    SqlCommand cmd = new SqlCommand(commandString, conn); 
    cmd.Parameters.Add("@newName", newName); 
    cmd.Parameters.Add("@userLevel", userLevel); 
    cmd.Parameters.Add("@userid", userid); 
    conn.Open(); 
    cmd.ExecuteReader(); 
    Reader.Close(); 
} 
+1

Bunu yapmak tercih edilen, güvenli bir yoldur (Kaybettiğim bazı ince böcekleri barikat) – Greg

+0

harika yanıtlar çocuklar! Takdir ederim! – RoundOutTooSoon

cevap

7

. Parametrelerin sql enjeksiyon saldırıları sizi açabilecek bir anlık SQL deyiminde kullanıcı tarafından sağlanan değerleri birleştirerek aksine, gitmek yoludur. Bu ayrıca yürütme planının yeniden kullanılmasına yardımcı olabilir. Ben eklemek istiyorum

tek şey, ben açıkça veri türü ve parametrelerinin Boyutları tanımlamak tercih olduğunu. Sonra yoksa Örneğin, bir örnek olarak, tüm dize değerleri NVARCHAR yerine VARCHAR olarak veritabanına geçirilen alacak. Bu yüzden açık olmayı severim. Hala bir statik sorgu dizesi var

4

o parametreli çünkü SQL enjeksiyon karşı güvenlidir. öyle ki @userid sağlanması gibi diğer güvenlik kaygıları, sahte değil, lütfen uygulamanın diğer katmanlarında ele alınmalıdır ayrı güvenlik kaygıları vardır. kod gayet iyi görünüyor Yani

2

.

var sql = "SELECT columns FROM Table WHERE 1=1"; 
if (!string.IsNullOrEmpty(txtName.Text)) sql += " AND Name LIKE '%' + @Name + '%'"; 
if (!string.IsNullOrEmpty(txtDesc.Text)) sql += " AND CONTAINS(DESCRIPTION, @description)"; 

Ama yine de, bu sürece devam ederken hala SQL Injection anlamda "güvenli" dir: Gerçekten de anında böyle — şey dizenin parçalarını "dinamik" sql inşa edilene kadar Kullanıcı girdisi ile gelen sorgunun her kısmı için parametreleri kullanmak.