Node.js中如何在conn.query中添加变量作为过滤条件?
安全地将变量作为过滤条件添加到SQL查询中
嘿,我来帮你搞定这个问题!首先得敲个警钟:直接把变量拼接进SQL语句里是极度危险的,这会让你的代码暴露在SQL注入攻击之下,所以咱们优先采用参数化查询的方式——这是数据库操作的标准安全实践。
推荐的参数化查询写法
大多数Node.js的数据库驱动(比如mysql、mysql2)都支持参数化查询,用?作为占位符,然后把变量放在数组里传递给查询方法:
var acc = '123456789'; conn.query( "SELECT Id,Body,Name FROM Attachment where ParentID = ?", [acc], // 这里的数组会自动替换SQL里的?占位符 function(err, result) { if (err) { return console.error(err); } console.log("records ? : " + result.records); console.log("total : " + result.totalSize); console.log("fetched : " + result.records.length); console.log("done ? : " + result.done); } );
为什么这么做?
- 数据库驱动会自动处理变量的转义,彻底避免SQL注入风险。
- 代码结构更清晰,可读性更强,也更容易维护。
不推荐的字符串拼接写法(仅作了解)
如果你真的要使用字符串拼接(再次强调:非常不推荐),必须手动对变量进行转义,否则会有严重的安全问题:
警告:如果
acc的值被恶意篡改(比如'123456789'; DROP TABLE Attachment;--),这种写法会直接删除你的数据库表!
var acc = '123456789'; // 使用驱动提供的escape方法转义变量 conn.query( "SELECT Id,Body,Name FROM Attachment where ParentID = " + conn.escape(acc), function(err, result) { if (err) { return console.error(err); } console.log("records ? : " + result.records); console.log("total : " + result.totalSize); console.log("fetched : " + result.records.length); console.log("done ? : " + result.done); } );
总之,参数化查询是绝对的首选,既能保证安全,又能提升代码质量。
内容的提问来源于stack exchange,提问作者learnjqueery
相关产品推荐
相关产品推荐

