Entity Framework Core 2.0 FromSql и SQL-инъекция - PullRequest
0 голосов
/ 24 октября 2018

Мне нужно знать правильный способ обработки SQL-инъекций при использовании команды FromSQL.

Во время выполнения мне нужно динамически создать инструкцию where.Поэтому я использую FromSql для создания команды SQL.Теперь я знаю, что использование интерполяции с использованием строк - это путь.Тем не менее, мне нужно пройти через список «Где параметров» для генерации команды.Достаточно просто сделать;

foreach (var x in wp)
{
    if (!string.IsNullOrEmpty(results))
        results = $"{results} and {x.Field} = {x.Value}";
    if (string.IsNullOrEmpty(results))
       results = $"where {x.Field} = {x.Value}";
}

Проблема в том, что это возвращает простую строку и не будет интерполяцией строки.Как я могу сделать это правильно?

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Мое решение этой проблемы - расширение VS, QueryFirst .QueryFirst создает оболочку C # для sql, которая находится в файле .sql.Таким образом, параметры - это единственный способ получить данные в вашем запросе, а внедрение SQL практически невозможно.Есть множество других преимуществ: вы редактируете свой sql в реальной среде, он постоянно проверяется на соответствие вашей базе данных, и использование вашего запроса в вашем коде очень просто.

0 голосов
/ 25 октября 2018

Entityframework будет параметризировать ваши запросы, если вы зададите его в следующем формате:

db.something.FromSql("SELECT * FROM yourTable WHERE AuthorId = {0}", id)

Является ли x.Field полем формы с фиксированным числом возможностей?то есть название, имя и т. д. Если это так, то что-то вроде следующего:

        var sqlstring = new StringBuilder();
        var sqlp = new List<SqlParameter>();

        var i = 0;
        foreach (var x in wp)
        {
            var param = "@param" + i.ToString();
            if (i!=0)
            {
                sqlstring.Append($" AND {x.Field} = " + param);
                sqlp.Add(new SqlParameter(param, x.Value));
            }
            if (i==0)
            {
                sqlstring.Append($"WHERE {x.Field} = " + " @param" + i.ToString());
                sqlp.Add(new SqlParameter(param, x.Value));
            }
            i++;
        }

Затем вам нужно будет сделать что-то вроде этого:

db.something.FromSql(sqlstring.ToString(), sqlp.ToArray())

Возможно, будет лучше / чищено это должно сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...