2013-11-11 5 views
-1

Я хочу защитить БД от атак SQL Injection, и я заметил, что сообщение http://www.dascode.net/post/2009/11/01/An-example-of-how-to-check-for-SQL-Injections.aspx может быть полезно.C# string и sql injection

Вот сценарий (я использую Entity Framework)

1) пользователь хочет добавить, например, комментарий вроде «Я хочу выбрать книгу, а затем открыть ее и получить символ».

фрагмент кода (пример):

string commVal = "lorem"; 

using(DB ctx = new DB()) 
{ 
    Comment c = new Comment { Value = commVal }; 
    ctx.Comment.Add(c); 
    ctx.SaveChanges(); 
} 

Как вы можете видеть, это не SQL Injection, но эта строка содержит нежелательные слова - select, open, char. Итак, единственный способ предотвратить внедрение SQL Injection - добавить кавычки вокруг этих нежелательных слов?

+0

Как вы строите запрос? Опубликуйте код - я подозреваю, что вы уже используете параметризованный sql, и в этом случае это не будет проблемой. http://msdn.microsoft.com/en-us/library/cc716760(v=vs.110).aspx – Alex

+2

** Только надежный ** способ избежать SQL-инъекции - использовать ** параметризованные запросы **. Даже не начинайте пытаться «очищать запрос» самостоятельно - вы всегда будете ** пропустить что-то ... просто используйте параметризованные запросы, и ваши проблемы уйдут! –

+1

Эта лошадь была мертвой в течение долгого времени: http://www.codinghorror.com/blog/2005/04/give-me-parameterized-sql-or-give-me-death.html – Faust

ответ

4

Нет, и оригинальная статья не работает вообще. Самый простой и дешевый способ избежать атак SQL-инъекций - использовать параметризованные запросы, и EF (и почти все ORM) делает именно это.

Параметрированный запрос - это запрос, в котором все внешние значения заменяются (строго типизированными) параметрами. Значения параметров передаются вне диапазона, поэтому невозможно реализовать SQL Injection.

Есть несколько дополнительных преимуществ при использовании параметризованных запросов:

  • избежать ошибок Интернационализация с ASCII, десятичные разделители, форматов даты, так как значения передаются в виде исходных типов.
  • Сетевой трафик сокращается, поскольку нативные представления неизменно меньше, чем их текстовые эквиваленты.
  • Результирующие запросы приводят к гораздо более высокой производительности системы, поскольку SQL Server должен только разобрать параметризованный запрос при первом его отправке. В последующих исполнениях используется первоначальный план выполнения.

Итак, оригинальная статья широко открыта для инъекций, в то время как EF безопасен.