У нас здесь еще одна дискуссия об использовании параметризованных запросов sql в нашем коде. У нас есть две стороны в обсуждении: я и некоторые другие, которые говорят, что мы всегда должны использовать параметры для защиты от инъекций sql, и другие ребята, которые не думают, что это необходимо. Вместо этого они хотят заменить отдельные апострофы двумя апострофами во всех строках, чтобы избежать инъекций sql. Все наши базы данных работают под управлением Sql Server 2005 или 2008, а наша кодовая база работает на .NET framework 2.0.
Приведу простой пример на C #:
Я хочу, чтобы мы использовали это:
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
Пока другие ребята хотят это сделать:
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, поскольку вы видите точный запрос, выполняемый в базе данных.
Итак. Мой вопрос в том, действительно ли достаточно использовать функцию SafeDBString, чтобы избежать атак с использованием sql-инъекций. Я пытался найти примеры кода, который нарушает эту меру безопасности, но не могу найти никаких примеров.
Есть ли кто-нибудь, кто может это сломать? Как бы ты это сделал?
РЕДАКТИРОВАТЬ: Подводя итоги ответов на данный момент:
- Еще никто не нашел способа обойти SafeDBString на Sql Server 2005 или 2008. Думаю, это хорошо?
- В нескольких ответах отмечалось, что вы получаете прирост производительности при использовании параметризованных запросов. Причина в том, что планы запроса можно использовать повторно.
- Мы также согласны с тем, что использование параметризованных запросов дает более читаемый код, который легче поддерживать.
- Кроме того, проще всегда использовать параметры, чем использовать различные версии SafeDBString, преобразования строки в числа и преобразования строки в дату.
- Используя параметры, вы получаете автоматическое преобразование типов, что особенно полезно, когда мы работаем с датами или десятичными числами.
- И наконец: не пытайтесь самостоятельно обеспечивать безопасность, как писал JulianR. Поставщики баз данных тратят много времени и денег на безопасность. Нет способа сделать что-то лучше и нет причин, по которым мы должны пытаться делать их работу.
Так что, хотя никто не смог взломать простую безопасность функции SafeDBString, у меня есть много других хороших аргументов. Спасибо!