У нас есть еще одно обсуждение здесь, когда мы работаем над использованием параметризованных sql-запросов в нашем коде. У нас есть две стороны в обсуждении: Я и некоторые другие, которые говорят, что мы всегда должны использовать параметры для защиты от инъекций sql и других парней, которые не считают это необходимым. Вместо этого они хотят заменить одиночные апострофы двумя апострофами во всех строках, чтобы избежать инъекций sql. Наши базы данных работают под управлением Sql Server 2005 или 2008, а наша база кода работает в .NET framework 2.0.
Позвольте мне привести простой пример в С#:
Я хочу, чтобы мы использовали это:
string sql = "SELECT * FROM Users WHERE [email protected]";
SqlCommand getUser = new SqlCommand(sql, connection);
getUser.Parameters.AddWithValue("@name", userName);
//... blabla - do something here, this is safe
В то время как другие ребята хотят это сделать:
string sql = "SELECT * FROM Users WHERE Name=" + SafeDBString(name);
SqlCommand getUser = new SqlCommand(sql, connection);
//... blabla - are we safe now?
Если функция SafeDBString определяется следующим образом:
string SafeDBString(string inputValue)
{
return "'" + inputValue.Replace("'", "''") + "'";
}
Теперь, пока мы используем SafeDBString для всех строковых значений в наших запросах, мы должны быть в безопасности. Правильно?
Есть две причины использовать функцию SafeDBString. Во-первых, это так, как это было сделано с каменного века, а во-вторых, проще отлаживать SQL-команды, так как вы видите запрос excact, который запускается в базе данных.
Итак, тогда. Мой вопрос заключается в том, действительно ли достаточно использовать функцию SafeDBString, чтобы избежать атак с SQL-инъекциями. Я пытался найти примеры кода, который нарушает эту меру безопасности, но я не могу найти никаких примеров этого.
Есть ли там кто-нибудь, кто может это сломать? Как бы вы это сделали?
EDIT: Подводя итог ответам:
- Никто не нашел способ обойти SafeDBString на Sql Server 2005 или 2008 еще. Это хорошо, я думаю?
- В нескольких ответах указывалось, что вы получаете выигрыш в производительности при использовании параметризованных запросов. Причина в том, что планы запросов могут быть повторно использованы.
- Мы также согласны с тем, что использование параметризованных запросов дает более читаемый код, который проще поддерживать
- Кроме того, легче всегда использовать параметры, чем использовать различные версии SafeDBString, преобразование строк в число и преобразование строк в дату.
- Используя параметры, вы получаете автоматическое преобразование типов, что особенно полезно, когда мы работаем с датами или десятичными числами.
- И, наконец, Не пытайтесь делать безопасность самостоятельно, как писал JulianR. Поставщики баз данных тратят много времени и денег на безопасность. Мы не можем сделать ничего лучше и не будем пытаться выполнять свою работу.
Так что, пока никто не мог нарушить простую безопасность функции SafeDBString, у меня появилось много других хороших аргументов. Спасибо!