2008-10-01 3 views
15

У меня возникла ситуация, когда мне нужно использовать метод ExecuteCommand LINQ для запуска вставки.Предоставляет ли LINQ ExecuteCommand защиту от атак SQL-инъекций?

Нечто подобное (упрощена для целей данного вопроса):

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

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

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

ответ

14

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

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

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

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

+8

Комментарий, ScottGu, \ больше, чем просто случайный парень в сети! http://en.wikipedia.org/wiki/Scott_Guthrie – nathaniel 2008-10-01 21:15:05

0

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

+0

SqlCommand и параметры безопасны, если вызываемая хранимая процедура не обрабатывает строки для обработки с помощью sp_exec. – DamienG 2008-10-02 04:28:50

Смежные вопросы