Node.js(v8.10.0)中如何向MySQL插入变量值?
解决Node.js中使用变量向数据库插入记录的问题
你遇到的问题其实很典型:直接把变量名写进SQL字符串里时,数据库会把ydate、ytime这些标识符当成列名而非变量的值,自然会触发错误;另外,这种写法还存在严重的SQL注入风险,咱们得用更规范安全的方式来实现。
针对你的Node.js v8.10.0版本,推荐两种可靠的解决方案:
方法一:使用参数化查询(最安全,优先推荐)
绝大多数Node.js数据库驱动(比如常用的mysql模块)都支持用占位符?替代变量,再把变量数组作为query方法的第二个参数传入,驱动会自动完成变量转义和替换,彻底规避SQL注入风险:
var ytime = '19:00:00'; var ydate = '2018-05-29'; var ytext = 'blabla'; connection.connect(function(err) { if (err) throw err; console.log("Connected!"); // 用?作为变量占位符 var sql = "INSERT INTO xtable (x_date, x_time, x_text) VALUES (?, ?, ?)"; // 将变量按顺序放入数组,传给query方法 connection.query(sql, [ydate, ytime, ytext], function (err, result) { if (err) throw err; console.log("1 record inserted"); connection.end(); }); });
方法二:使用ES6模板字符串(仅适合非用户输入场景)
如果是简单的内部逻辑场景,也可以用ES6模板字符串(反引号`)拼接变量,但这种方式绝对不能用于处理用户输入的内容,否则会暴露在SQL注入的风险下:
var ytime = '19:00:00'; var ydate = '2018-05-29'; var ytext = 'blabla'; connection.connect(function(err) { if (err) throw err; console.log("Connected!"); // 用${变量名}语法插入变量值 var sql = `INSERT INTO xtable (x_date, x_time, x_text) VALUES ('${ydate}', '${ytime}', '${ytext}')`; connection.query(sql, function (err, result) { if (err) throw err; console.log("1 record inserted"); connection.end(); }); });
为什么优先选参数化查询?
- 自动处理字符串转义:比如如果
ytext包含单引号,模板字符串会直接报错,而参数化查询会自动转义特殊字符 - 从根源上阻止SQL注入:这是生产环境必须遵守的安全规范,能避免恶意用户通过构造特殊输入篡改数据库操作
内容的提问来源于stack exchange,提问作者Flint
相关产品推荐
相关产品推荐

