节点 MSSQL 动态查询

Node MSSQL Dynamic Query

我目前正在使用以下代码构建动态查询:

 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 有能力做到这一点

怎么样:

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);
});