节点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',AssignedUserId)

    }

这样可以防止SQL注入

另一种选择是,如果我使用了名为node-sanitize的第三方库 清理每个参数,但似乎有点过头,尤其是因为node-mssql有能力做到这一点

q328849980qqq 回答:节点MSSQL动态查询

怎么样:

return dbc.then(pool => {
  return pool.request()
    .input('ClientId',sql.Int,ClientId)
    .input('AssignedUserid',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);
});
本文链接:https://www.f2er.com/3036951.html

大家都在问