我目前正在使用以下代码构建动态查询:
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有能力做到这一点