节点 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);
});
我目前正在使用以下代码构建动态查询:
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);
});