请教一个基础问题关于参数和sql构造?
发布于 7 年前 作者 vangehome 2528 次浏览 来自 问答

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).... 
  1. 使用 mysql.escape 来转义
  2. 写一个算法,来构造字符串。。。
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 ;--; '
回到顶部