Ну, я не согласен, что инъекция невозможна в 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.