Обеспечивает ли LINQ ExecuteCommand защиту от атак SQL-инъекций? - PullRequest
15 голосов
/ 01 октября 2008

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

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

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

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

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

Ответы [ 2 ]

14 голосов
/ 01 октября 2008

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

В моем простом тестировании это выглядит так параметры, переданные в 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; вместо этого они используют реальные параметры запроса.

0 голосов
/ 02 октября 2008

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

...