Dapper и SQL инъекция - PullRequest
       18

Dapper и SQL инъекция

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

В моем случае я не мог использовать параметризованные запросы для некоторых параметров, таких как фильтр, потому что фильтр представляет собой длинную строку (а не один параметр), поэтому я нахожу решение для этого.У меня есть следующий фрагмент кода из моей строки запроса.Я попытался поставить "@filter", но кажется, что сначала более грубая строка запроса.

Например, я не могу установить ".... Column = @value" из-за фильтра моего спискаможет меняться как содержать, начинается с .....

queryString = @"SELECT 
                    R.RequestId As requestId, 
                    R.Number AS number, 
                    R.CargoReadyDate AS readyDate, 
                    PL.Name AS portIdOfLoading,  
                    PD.Name AS portIdOfDischarge,  
                    R.Status AS status,  
                    R.AllInFreightAmount_Value AS requestAmount , 
                    R.CreatedDate AS requestDate, 
                    R.AllInFreightAmount_Currency as currency 
                FROM 
                    Requests R  
                JOIN
                    [Ports] PL ON R.PortIdOfLoading = PL.PortId 
                JOIN
                    [Ports] PD ON R.PortIdOfDischarge = PD.PortId  
                WHERE 
                    R.ShipperId = @accountId And " + statusFilter + filter + " " +
              @"ORDER BY 
                    R.CreatedDate DESC 
                    OFFSET @pageSize * (@pageNumber - 1) ROWS 
                    FETCH NEXT @pageSize ROWS ONLY ";

var data = _dapperService.QueryDataSet<RequestDto>(queryString,
            new { accountId = query.AccountId, status = query.RequestStatus, pageSize = query.PageSize, pageNumber = query.PageNumber }, CommandType.Text);

return data;

1 Ответ

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

В конечном счете, Даппер не может помочь ни с чем, что происходит за пределами фактического шага параметризации;если вы введете дыры для SQL-инъекций до того, как передаст их Dapper: да, у вас будут дыры для SQL-инъекций.

Однако вы все равно можете использовать Dapper с нетривиальными запросами;и вы все еще можете параметризовать.Например, вы можете сделать:

int? userId = /* something, could be null */
string region = /* something, could be null */

var sql = new StringBuilder(@"select ... /* whatever */ where Open = 1");
if (userId != null) sql.Append(" and UserId = @userId");
if (region != null) sql.Append(" and Region = @region");
// ... etc

var data = conn.Query<SomeType>(sql.ToString(), new { userId, region }).AsList();

Здесь Dapper будет добавлять только те параметры, которые он на самом деле видит, используемые в запросе;поэтому, если @userId не появляется, он не добавляет этот параметр.Но самое важное: запрос по-прежнему полностью параметризован и не имеет дыр в SQL-инъекциях.

В более сложных сценариях Dapper также поддерживает словарные параметры, для которых необходимо добавлять параметры по запросу, а не статически.

...