Возможна ли инъекция через динамический LINQ? - PullRequest
40 голосов
/ 05 января 2012

При использовании библиотеки Dynamic LINQ ( link ) она уязвима для инъекций?и (если так) как это можно защитить?

Некоторые сведения из Соображения безопасности (Entity Framework) :

LINQ to Entities Атаки с помощью инъекций:

Хотя составление запроса возможно в LINQ to Entities, оно выполняется через API объектной модели.В отличие от запросов Entity SQL, запросы LINQ to Entities не составляются с использованием строковых операций или конкатенации и не подвержены традиционным атакам с использованием SQL-инъекций.

Поскольку динамический SQL составляется с использованием строк, это означает, чтоэто может быть восприимчивым к векторам инъекции?Или LINQ to SQL автоматически позаботится о параметризации ваших значений на основе базового типа данных в библиотеке Dynamic LINQ?

Или это абсолютно безопасно, поскольку динамический запрос будет выполняться в памяти, а не против SQL (тем самымотрицая какие-либо преимущества от индексов SQL)?

Я работал над пониманием кода DynamicLibrary.cs, но я уверен, что мог бы легко что-то пропустить.

Поскольку этот вопрос о динамическомВ самой библиотеке LINQ этот вопрос можно считать применимым как к linq-to-sql, так и к linq-to-entities (несмотря на упоминание выше Entity Framework).

Ответы [ 2 ]

31 голосов
/ 26 января 2012

Ну, я не согласен, что инъекция невозможна в Dynamic Linq.

То, что описано в ответе *iamond ǤeezeƦ , верно, но относится кстандартный Linq, созданный на данном языке - C # или VB.Net, или путем вызова методов расширения, таких как .Where, с лямбда-функциями.

Тогда, правда, невозможно внедрить что-либо, поскольку переводчик .NET Linq to Sql, конечно, написан прилично.Таким образом, «SQL-инъекция» невозможна, это правда.

Однако, что возможно с Dynamic Linq, так это атака «Linq инъекция».В объяснении безопасности linq, цитируемом OP, указывается:

LINQ to Entities запросы не составляются с использованием строковых манипуляций или конкатенации, и они не подвержены традиционным атакам SQL-инъекций.

И в основном это суть.Если запросы состоят из манипуляций со строками, то они подвержены атакам с использованием инъекций.А Dynamic Linq на самом деле состоит из строк, поэтому он потенциально подвержен атакам с помощью инъекций.

Очевидно, что злоумышленник должен осознавать тот факт, что вы используете DynamicLinq, и может атаковать только при подготовке данных, поэтомуэто приводит к действительному вредоносному запросу Dynamic Linq.

Я хочу подчеркнуть этот факт - окончательный SQL составлен безопасно , но безопасно ли оригинальный динамический Linq зависит отвы .

Для обеспечения безопасности динамического запроса linq необходимо использовать заполнители для всех пользовательских данных .Никогда не объединяйте вашу строку!

Представьте себе следующий запрос:

dataset.Where("allowed == 1 and code == \"" + user_entered_data + "\"");

Если ввод не очищен и не экранирован, злоумышленник может потенциально ввести:

200" or allowed == 0 and code == "200

, которыйприведет к:

allowed == 1 and code == "200" or allowed == 0 and code == "200"

Во избежание этого вы должны использовать заполнители:

dataset.Where("allowed == 1 and code == @0", user_entered_data);

DynamicLinq сделает заполнитель (в данном случае введенные пользователем данные) лямбда-выражениемаргумент (вместо того, чтобы объединить его в запрос) и зависит от Linq-To-Entities (или какой-либо другой сервер) для безопасного преобразования в SQL.

3 голосов
/ 05 января 2012

Из изучения пространства имен System.Data.Linq я знаю, что дерево объектов SQL строится на основе запроса LINQ, и в рамках этого процесса класс SqlParameterizer вызывается для замены всех встроенных значений параметрами. Значения затем присваиваются параметрам. Поэтому атаки с использованием SQL-инъекций не должны быть возможными.

...