Node JS,使用MSSQL(注意是sql server,不是MySQL,但应该思想差不多把)如何在防SQL注入的情况下,设定查询条件默认值呢?
查询(增加时大概也要?)我想要的结果是,如果前端某个条件给的是空字符串'',那么我后端在这里查询时要不直接省略该条件要不附上or 1=1,使用的是字符串拼接:
let sql = ''
for (let k in req.body) {
let str = (req.body[k] === '') ? '' : ' and ' + `${k} = ` + req.body[k]
sql += str
}
//这里是剔除掉第一个and字符串
let querySql = `select *
from userInfo
where ${sql.slice(4)}
order by OperationTime desc`
//如果前端传了Age,那就加上 Age = xx,否则就拼一个空字符串 ''
//querySql = `select * from userInfo where DeptID = 15 order by OperationTime desc`
//querySql = `select * from userInfo where DeptID = 15 and Age =23 order by OperationTime desc`
但是问题来了,如果前端传递的值为{Age: "18 or 1 = 1; update userinfo set age = 18"},那么这里就会导致该条件通过,并意外执行语句(这是我理解的SQL注入)
所以需要用防注入。看了下该模块的github,其中提到使用input去做防注入,就像这样
const testConn = new sql.ConnectionPool(testConfig)
testConn.connect().then(pool => {
pool.request()
.input('DeptIDQ', sql.Int, req.body.DeptID)
.input('AgeQ', sql.Int, req.body.Age)
.query('select * from userinfo where DeptID = @DeptIDQ and Age = @AgeQ'
).then(result => {
console.log('查询成功', result)
res.send(result)
}).catch(err => console.log(err))
}).catch(err => {
console.log('失败了', err)
})
这样确实能处理防注入。但问题是如果没有传递该参数要怎么做缺省处理呢?譬如没有传递Age参数(或者是传递的''空字符串),那这个query就报错了,因为Age条件是空的。
有什么方法能同时处理这两个情况嘛?缺省+防注入
多加个判断完事