Postgres FromSqlRaw Не правильно принимает параметры - PullRequest
0 голосов
/ 08 апреля 2020

TL & DR:

  1. Когда я выполняю интерполяцию строк ВНЕ FromSqlRaw, работает команда SQL.
  2. Когда я использую SQLRAW и передаю переменную в рамках функции. Это больше не работает, хотя в документации сказано, что должно.

Ниже приведен рабочий НЕПРАВИЛЬНЫЙ метод выполнения интерполяции строк.

    [HttpGet("/home/dashboard/search")] 
    public async Task<ActionResult> dashboard_search([FromQuery] string search_string)
    {

    var query_string = $"select id, country_code, country_name, count(*) OVER() as total_count from ipaddresses where ipaddress::text LIKE '%{search_string}%' limit 8;";

    var results = await this._context.getDashboardSearchIpAddresses.FromSqlRaw(query_string).ToListAsync();

    return Ok(results);

    }

Однако он уязвим для SQL инъекции. <- НЕ ДЕЛАЙТЕ ЭТОГО !!! </strong>

Документация Microsoft гласит следующее:

FromSqlInterpolated аналогичен FromSqlRaw, но позволяет использовать синтаксис интерполяции строк. Как и FromSqlRaw, FromSqlInterpolated можно использовать только для корней запросов. Как и в предыдущем примере, значение преобразуется в DbParameter и не подвержено SQL инъекции.

Когда я пытаюсь использовать FromSqlRaw, я получаю пустой набор результатов

    [HttpGet("/home/dashboard/search")]
    public async Task<ActionResult> dashboard_search([FromQuery] string search_string)
    {
        var results = await this._context.getDashboardSearchIpAddresses.FromSqlRaw("select id, country_code, country_name, count(*) OVER() as total_count from ipaddresses where ipaddress::text LIKE '%{0}%' limit 8;",search_string).ToListAsync(); 
return Ok(results); }

СМ. Ссылка: https://docs.microsoft.com/en-us/ef/core/querying/raw-sql

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Извините, что не перед P C для проверки, может быть что-то вроде:

var searchParam = new SqlParameter("searchParam", search_string);
var results = await this._context.getDashboardSearchIpAddresses.FromSqlInterpolated($"select id, country_code, country_name, count(*) OVER() as total_count from ipaddresses where ipaddress::text LIKE %{searchParam}% limit 8").ToListAsync();

Или это с использованием Raw:

var searchParam = new SqlParameter("searchParam", $"%{search_string}%");
var results = await this._context.getDashboardSearchIpAddresses.FromSqlRaw("select id, country_code, country_name, count(*) OVER() as total_count from ipaddresses where ipaddress::text LIKE @searchParam limit 8;",searchParam).ToListAsync();
0 голосов
/ 08 апреля 2020

Выше приведен «правильный» ответ для всех случаев, кроме случаев использования Postgres

  var searchParam = new NpgsqlParameter("searchParam", $"%{search_string}%");
  var results = await this._context.getDashboardSearchIpAddresses.FromSqlRaw("select id, split_part(text(ipaddress),'/',1) as ipaddress, country_code, country_name, count(*) OVER() as total_count from ipaddresses where ipaddress::text LIKE @searchParam limit 8;", searchParam).ToListAsync();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...