2015-10-16 2 views
0

Поэтому у меня есть небольшая проблема. На веб-сайте, который я разрабатываю, я разрешаю людям вводить адрес, как только они нажимают кнопку сохранения, адрес, который они печатают, сохраняется в моей базе данных.SQL-инъекция с параметризованными запросами в ASP.NET

Я был (ошибочно) под впечатлением, что использование параметризованных запросов поможет предотвратить инъекции SQL, вот мой код, когда они нажмите «сохранить»

SqlConnection Conn = new SqlConnection(@"Data Source=**********;Initial Catalog=********;Persist Security Info=True;User ID=******;Password=*********"); 
SqlCommand updateMeeting = new SqlCommand(@"UPDATE [*******].[dbo].[**********] SET [email protected], [email protected], [email protected], [email protected] WHERE Title = '" + commands[1] + "' AND Date = '" + Convert.ToDateTime(commands[2]) + "' AND Location = '" + commands[3] + "'", Conn); 
updateMeeting.Parameters.AddWithValue("@title", newTitle); 
updateMeeting.Parameters.AddWithValue("@date", newDate); 
updateMeeting.Parameters.AddWithValue("@location", newLocation); 
updateMeeting.Parameters.AddWithValue("@announcement", newBody); 
updateMeeting.Connection.Open(); 
updateMeeting.ExecuteNonQuery(); 
updateMeeting.Connection.Close(); 

newTitle, newDate, newLocation и newBody просто строковые переменные взятых из соответствующих текстовых полей.

Будьте уверены, что массив команд дезинфицирован. Это не то, где моя проблема с инъекцией вступает в игру.

и все же, если я ввожу следующее в моем «месте» текстовое поле атака впрыска успешно и ряд добавляется в моей базе данных

');INSERT INTO [********].[dbo].[*********] (Title) VALUES ('Injection'); -- 

Итак, ясно, что я пропустил что-то, или я не понимая, как работают эти параметризованные запросы. Разве не вся цель этой вещи, чтобы убедиться, что значение VarChar для «местоположения» просто «»), INSERT INTO [****]. [Dbo]. [******] (Title) ЦЕННОСТИ («Впрыск») - «

Не следует ли атака впрыска не удалась?

+3

'И Местоположение =«»+ команды [3]' Это не параметризация, просто нормальная конкатенации Так кто-то может написать что-нибудь – lad2025

+1

Ваш весь 'WHERE' статья использует конкатенацию.. – Greg

+0

Каково значение 'commands [3]', когда выполняется оператор с попыткой инъекции? –

ответ

3

Вы действительно близко - вы параметрироваться значения вы обновляете с, но не значения в вашем предложении WHERE. Попробуйте что-нибудь подобное вместо этого:.

SqlConnection Conn = new SqlConnection(@"Data Source=**********;Initial Catalog=********;Persist Security Info=True;User ID=******;Password=*********"); 
SqlCommand updateMeeting = new SqlCommand(@" 
    UPDATE [*******].[dbo].[**********] 
    SET [email protected], 
     [email protected], 
     [email protected], 
     [email protected] 
    WHERE Title = @commands1 
     AND Date = @commands2 
     AND Location = @commands3", 
     Conn); 
updateMeeting.Parameters.AddWithValue("@title", newTitle); 
updateMeeting.Parameters.AddWithValue("@date", newDate); 
updateMeeting.Parameters.AddWithValue("@location", newLocation); 
updateMeeting.Parameters.AddWithValue("@announcement", newBody); 
updateMeeting.Parameters.AddWithValue("@commands1", commands[1]); 
updateMeeting.Parameters.AddWithValue("@commands2", Convert.ToDateTime(commands[2])); 
updateMeeting.Parameters.AddWithValue("@commands3", commands[3]); 
updateMeeting.Connection.Open(); 
updateMeeting.ExecuteNonQuery(); 
updateMeeting.Connection.Close(); 
+0

Хороший ответ, показывает возможное решение, а не просто указывая на проблему +1. OP может захотеть использовать 'Parameters.Add (" @ title ", SqlType.VarChar) .Value = newTitle' для de разглагольствующих. 'AddWithValue' имеет некоторые риски в зависимости от типа/размера базы данных. – ovaltein

+0

Спасибо за ваш код и быстрый ответ. Я рад, что это было поймано и исправлено до того, как оно вступило в производство. –

1

Это не параметризованный запрос. В вашей статье where вы просто конкатенации строк:

"... WHERE Title = '" + commands[1] + "' AND Date = '" + Convert.ToDateTime(commands[2]) + "' AND Location = '" + commands[3] + "'" 
Смежные вопросы