Динамический LINQ с прямым вводом данных пользователем, какими-либо опасностями?

Ответ уже был дан, при всем уважении к автору ответа, я утверждаю, что могут быть сделаны некоторые улучшения в ответе, как синтаксически, так и с точки зрения производительности:

  1. [1117 ] reduce следует избегать, если источник очень большой, хотя я всегда предпочитаю reduce, если источник относительно мал (data.length < 1000). Попробуйте использовать POF (обычный старый для :)) , так как это самый быстрый вариант.

  2. Карта ES6 является хорошим помощником, когда мы имеем дело с парами ключ-значение , но я предпочитаю POO (plain old object:) ), если это возможно и это сделает наш код более эстетичным.

Я предоставлю свое решение этой проблемы (в худшем случае он запустит O (n) и использует дополнительное пространство O (n) для пар ключ-значение, он выполнит два прохода на источнике, второй проход необходим, чтобы поставить 1 там, где мы пропустили, когда мы впервые встретились с ним на первом проходе):

let data =  [
  {count: 400, value: "Car Wash Drops"},
  {count: 48, value: "Personal/Seeding"},
  {count: 48, value: "Personal/Seeding"},
  {count: 300, value: "Operators/Management"},
  {count: 48, value: "Personal/Seeding"}
];

const map = {};

for (let i=0;i[o.value,o.count]));

или более краткая версия с использованием оператора ES6 of [ссылка на] :

let data =  [
      {count: 400, value: "Car Wash Drops"},
      {count: 48, value: "Personal/Seeding"},
      {count: 48, value: "Personal/Seeding"},
      {count: 300, value: "Operators/Management"},
      {count: 48, value: "Personal/Seeding"}
    ];

    const map = {};

    for (let d of data) {
      map[d.value] = map[d.value]+1 || 0;
      d.value = map[d.value]?d.value+` (${map[d.value]+1})`:d.value; 
    }

    for (let d of data) {
      d.value = map[d.value]?d.value+` (1)`:d.value; 
    }

    console.log(data.map(o=>[o.value,o.count]));

10
задан Maksym Gontar 7 March 2009 в 12:03
поделиться

3 ответа

Гул... Я только что нашел по крайней мере одну возможную проблему с Динамическим Linq. Просто должностное лицо этот отрывок 1000 раз и часы для потребления ресурсов ЦП и потребления памяти, идущего высоко (создающий простой способ к атаке "отказ в обслуживании"):

var lambda = DynamicExpression
  .ParseLambda<Order, bool>("Customer=string.Format(\"{0,9999999}"+
     "{0,9999999}{0,9999999}{0,9999999}{0,9999999}\",Customer)")
  .Compile();

var arg = new Order
{
  Total = 11
};
Console.WriteLine(lambda(arg));

Я записал сообщение в блоге на этом.

9
ответ дан 3 December 2019 в 15:53
поделиться

Поскольку LINQ к SQL использует безопасные с точки зрения типов классы модели данных, Вы защищены от Атак с использованием кода на SQL по умолчанию. LINQ к SQL автоматически закодирует значения на основе базового типа данных.
(c) ScottGu

Но можно все еще добраться, "делятся на нуль" там, таким образом, рекомендуется обработать все непредвиденные исключительные ситуации и также ограничить продолжительность действительных доступов, JIC

10
ответ дан 3 December 2019 в 15:53
поделиться

Просто мысль, но Вы посмотрели на Услуги передачи данных ADO.NET? Это обеспечивает, поддерживающий REST API во многом как вышеупомянутое с большой стандартной функциональностью LINQ встроил.

Я не могу думать об интересе динамическое использование LINQ вершины моей головы, но если бы это было я, то я, по крайней мере, добавил бы участников в белый список (OrderID, CustomerName, и т.д.) - но я, вероятно, записал бы Expression логика непосредственно; не особенно трудно, если Вы только поддерживаете прямые свойства.

Например, вот Where (использование Вашего Contains логика):

static IQueryable<T> Where<T>(this IQueryable<T> source,
    string member, string value)
{
    var param = Expression.Parameter(typeof(T), "x");
    var arg = Expression.Constant(value, typeof(string));
    var prop = Expression.PropertyOrField(param, member);
    MethodInfo method = typeof(string).GetMethod(
        "Contains", new[] { typeof(string) });
    var invoke = Expression.Call(prop, method, arg);
    var lambda = Expression.Lambda<Func<T, bool>>(invoke, param);

    return source.Where(lambda);
}

Я покрыл OrderBy ранее, здесь.

8
ответ дан 3 December 2019 в 15:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: