Краткий ответ: LINQ не уязвим для внедрения SQL.
Длинный ответ:
LINQ не похож на SQL.За кулисами существует целая библиотека, которая создает SQL из деревьев выражений, сгенерированных компилятором из вашего кода, отображая результаты в объекты - и, конечно, она заботится о том, чтобы все было в безопасности на пути.LINQ to SQL FAQ :
Q.Как LINQ to SQL защищен от атак с использованием SQL-инъекций?
A.Внедрение SQL было значительным риском для традиционных запросов SQL, сформированных путем объединения пользовательских данных.LINQ to SQL позволяет избежать такого внедрения, используя SqlParameter в запросах.Пользовательский ввод превращается в значения параметров.Этот подход предотвращает использование вредоносных команд из пользовательского ввода.
Внутренне это означает, что когда LINQ to SQL запрашивает базу данных, вместо использования простых значений, они передают их как параметры SQL , что означает, что они не могут никогда рассматриваться базой данных как исполняемый код.Это также верно для большинства (если не всех) картографов ORM.
Сравните эти два подхода (полностью псевдокод):
string name = "' ; DROP DATABASE master --"
run ("SELECT * FROM Authors WHERE Name = '" + name + "'") // oops!
// now we'd better use parameters
SqlParameter name = new SqlParameter ("@name", "' ; DROP DATABASE master --")
run ("SELECT * FROM Authors WHERE Name = @name", name) // this is pretty safe
Я предлагаю вам глубже погрузиться в то, что LINQоператоры на самом деле означают и когда и как они переводятся в реальный SQL.Возможно, вы захотите узнать о LINQ стандартном переводе операторов запросов , отложенное выполнение , различных провайдеров LINQ и так далее.В случае LINQ, как и любой другой технологии абстракции, интересно и невероятно полезно знать, что происходит за кулисами.
PS Каждый раз, когда я вижу вопрос об SQL-инъекции, я не могу не вспомнить этот веб-комикс.