请教一个基础问题关于参数和sql构造?
router.get("/goods/:goodsid",function (req,res,next) {
var sql="select * from table where ";
if(req.query.a!=null) {
console.log(req.query.limit);
sql+=" a="+req.query.a;
}
if(req.query.b!=null){
sql+=" and b="+req.query.b;
}
if(req.query.c!=null){
sql+=" and c="+req.query.c;
}
//...
})
1、为了防sql注入一般是怎么做的? 2、那些可选参数,比如从客户端页面传过来的a,b,c 三个参数可能是可选的,所以怎么灵活判断是否有参数并且传入数据库操作?
3 回复
1、为了防sql注入一般是怎么做的?
SQL 预编译,表现到 API 层面,一般是“点位符”形式。
2、那些可选参数,比如从客户端页面传过来的a,b,c 三个参数可能是可选的,所以怎么灵活判断是否有参数并且传入数据库操作?
!!req.query.a
就好了吧,都是字符串。
var sql="select * from table where ",
args=[];
if(req.query.a) {
sql+=" a=?";
args.push(req.query.a);
}
if(req.query.b){
sql+=" and b=?";
args.push(req.query.b)
}
if(req.query.c){
sql+=" and c=?";
args.push(req.query.c);
}
db.query(sql,args)....
- 使用 mysql.escape 来转义
- 写一个算法,来构造字符串。。。
const mysql = require('mysql');
function createSql(query) {
let sql = 'select * from table where';
Object.keys(query).forEach((key, index) => {
let value = mysql.escape(query[key]); // escape 转义
index === 0 ? sql += ` ${key}=${value}` : sql += ` and ${key}=${value}`;
});
return sql;
}
console.log(
createSql({ a: 1, b: '2 or 1 ;--; ' })
);
// select * from table where a=1 and b='2 or 1 ;--; '