Динамический запрос узла MSSQL

В настоящее время я создаю динамический запрос, используя приведенный ниже фрагмент кода:

 var conditions = `AND 1 = 1`;
    if (params.AssignedUserId) {
        conditions += `AND x.AssignedUserId = ${params.AssignedUserId}`;
    }
    return dbc.then(pool => {
        return pool.request()
            .input('ClientId', sql.Int, ClientId)
            .query(`SELECT *     
                    FROM  ${db.Enquiry}.Customers x 
                    WHERE x.ClientId = @ClientId
                    ${conditions}`)
    }).then(result => {
        return result.recordset;
    }).catch(err => {
        console.error(err);
    });

Это отлично работает, однако основная проблема заключается в том, что params.AssignedUserId не дезинфицирован, есть ли способ вместо этого добавить значение в качестве входного параметра?

Что-то, чтобы я мог переписать это так:

    if (params.AssignedUserId) {
        conditions += `AND x.AssignedUserId = @AssignedUserId`;

        // Something to add as input param to query

       .input('AssignedUserId', sql.Int, AssignedUserId)

    }

Затем это будет защищено от SQL-инъекций.

Альтернативой было бы использование третьей частичной библиотеки под названием node-sanitize для очистки каждого параметра, но кажется излишним, тем более что node-mssql имеет возможность сделать это


person Tam2    schedule 25.11.2019    source источник


Ответы (1)


Как насчет:

return dbc.then(pool => {
  return pool.request()
    .input('ClientId', sql.Int, ClientId)
    .input('AssignedUserid', sql.Int, params.AssignedUserid)
    .query(`SELECT *     
                FROM  ${db.Enquiry}.Customers x 
                WHERE x.ClientId = @ClientId AND
                      COALESCE(@AssignedUserId, x.AssigneduserId) = x.AssignedUserId`)
}).then(result => {
  return result.recordset;
}).catch(err => {
  console.error(err);
});
person paul    schedule 25.11.2019
comment
Отлично, не подумал об использовании COALESCE для этого. Добавлена ​​оболочка ISNULL вокруг x.AssignedUserId для соответствия NULL, и теперь она работает должным образом. Думаю, для запросов с несколькими комбинациями входных параметров я могу просто добавить больше операторов COALESCE. - person Tam2; 25.11.2019