Как LINQ-To-SQL предотвращает SQL-инъекции? - PullRequest
5 голосов
/ 12 мая 2011

В настоящее время я делаю проект с C # и LINQ-TO-SQL.Этот проект имеет высокий приоритет безопасности, поэтому, очевидно, я хочу предотвратить SQL-инъекции.Я гуглил по этому вопросу, но ничего полезного не получается.Часто задаваемые вопросы Microsoft говорили мне, что инъекции не будут проблемой, из-за того, как LINQ обрабатывает параметры, однако, увидев код, который LINQ производит в отладчике, и прочитав немного о том, как LINQ-To-SQL просто собирается в SQL, я не уверенкак это применимо.

Есть ли у кого-нибудь какая-либо литература / связь, которая занимается этим вопросом?

Ответы [ 3 ]

6 голосов
/ 12 мая 2011

Linq to SQL автоматически использует SQLParameters . Пользовательский ввод превращается в значения параметров, а не просто представляет собой сцепленную строку (что позволяет использовать SQL-инъекции). Это происходит на сервере, IIRC, так что вы можете просто увидеть код на стороне клиента. Если вы хотите немного больше информации и информации, вы можете прочитать информацию здесь .

6 голосов
/ 12 мая 2011

Это довольно просто, на самом деле - перевод никогда не вводит переменные без их параметризации;так:

var orders = from ord in ctx.Orders
             where ord.CustomerName = name
             select ord;

станет:

SELECT * FROM [dbo].[Orders] WHERE [CustomerName] = @p0

, где p0 - это параметр со значением, взятым из захваченного вами name

не более, не менее,Но это позволяет избежать инъекционных атак.Контраст с неверным случайным:

var sql = "SELECT * FROM [dbo].[Orders] WHERE [CustomerName] = '" + name + "'";

, который создает огромные риски.Вы, конечно, также можете правильно параметризировать вышеприведенное:

var sql = "SELECT * FROM [dbo].[Orders] WHERE [CustomerName] = @name";

(и добавить параметр @name со значением из name)

1 голос
/ 12 мая 2011

Используются параметризованные запросы. http://www.devx.com/dotnet/Article/34653/1954

...