LINQ ExecuteCommand обеспечивает защиту от атак SQL-инъекций?

У меня есть ситуация, когда мне нужно использовать метод LINQ ExecuteCommand для запуска вставки.

Что-то вроде (упрощенное для этого вопроса):

object[] oParams = { Guid.NewGuid(), rec.WebMethodID };

TransLogDataContext.ExecuteCommand (
"INSERT INTO dbo.Transaction_Log (ID, WebMethodID) VALUES ({0}, {1})",
oParams);

Вопрос в том, является ли это доказательством SQL-инъекции тем же способом, что и параметризованные запросы?

Ответы

Ответ 1

Было ли какое-то исследование, и я нашел это:

В моем простом тестировании это выглядит параметры, переданные в ExecuteQuery и ExecuteCommand методы автоматически закодированы SQL на основе поставляемой ценности. Так если вы передадите строку с символом ' символ, он автоматически SQL убегайте его в ''. Я считаю, что аналогичные политика используется для других типов данных например DateTimes, Decimals и т.д.

http://weblogs.asp.net/scottgu/archive/2007/08/27/linq-to-sql-part-8-executing-custom-sql-expressions.aspx
(У вас есть прокрутка вниз, чтобы найти его)

Это кажется мне немного странным - большинство других .Net-инструментов лучше знают, чем "SQL-побег"; вместо этого они используют реальные параметры запроса.

Ответ 2

LINQ to SQL использует exec_sql с параметрами, что намного безопаснее, чем конкатенация в строку запроса ad-hoc. Это должно быть безопасно снова в SQL-инъекции с использованием SqlCommand и его коллекции Paramaters (фактически, вероятно, что LINQ to SQL использует внутренне). Опять же, насколько безопасно это?