为了防止SQL注入,可以将SQL中传入参数进行编码,而不是直接进行字符串拼接。在node-mysql中,防止SQL注入的常用方法有以下四种:

方法一:使用escape()对传入参数进行编码:

参数编码方法有如下三个:

mysql.escape(param)

connection.escape(param)

pool.escape(param)

例如:

var userId = 1, name = 'test';

var query = connection.query('SELECT * FROM users WHERE id = ' + connection.escape(userId) + ', name = ' + connection.escape(name), function(err, results) {

// ...

});

console.log(query.sql); // SELECT * FROM users WHERE id = 1, name = 'test'

escape()方法编码规则如下:

Numbers不进行转换;

Booleans转换为true/false;

Date对象转换为’YYYY-mm-dd HH:ii:ss’字符串;

Buffers转换为hex字符串,如X’0fa5’;

Strings进行安全转义;

Arrays转换为列表,如[‘a’, ‘b’]会转换为’a’, ‘b’;

多维数组转换为组列表,如[[‘a’, ‘b’], [‘c’, ‘d’]]会转换为’a’, ‘b’), (‘c’, ‘d’);

Objects会转换为key=value键值对的形式。嵌套的对象转换为字符串;

undefined/null会转换为NULL;

MySQL不支持NaN/Infinity,并且会触发MySQL错误。

方法二:使用connection.query()的查询参数占位符:

可使用 ? 做为查询参数占位符。在使用查询参数占位符时,在其内部自动调用 connection.escape()方法对传入参数进行编码。

如:

var userId = 1, name = 'test';

var query = connection.query('SELECT * FROM users WHERE id = ?, name = ?', [userId, name], function(err, results) {

// ...

});

console.log(query.sql); // SELECT * FROM users WHERE id = 1, name = 'test'

上面程序还可以改写成如下:

var post = {userId: 1, name: 'test'};

var query = connection.query('SELECT * FROM users WHERE ?', post, function(err, results) {

// ...

});

console.log(query.sql); // SELECT * FROM users WHERE id = 1, name = 'test'

方法三: 使用escapeId()编码SQL查询标识符:

如果你不信任用户传入的SQL标识符(数据库、表、字符名),可以使用escapeId()方法进行编码。最常用于排序等。escapeId()有如下三个功能相似的方法:

mysql.escapeId(identifier)

connection.escapeId(identifier)

pool.escapeId(identifier)

例如:

var sorter = 'date';

var sql = 'SELECT * FROM posts ORDER BY ' + connection.escapeId(sorter);

connection.query(sql, function(err, results) {

// ...

});

方法四: 使用mysql.format()转义参数:

准备查询,该函数会选择合适的转义方法转义参数    mysql.format()用于准备查询语句,该函数会自动的选择合适的方法转义参数。

例如:

var userId = 1;

var sql = "SELECT * FROM ?? WHERE ?? = ?";

var inserts = ['users', 'id', userId];

sql = mysql.format(sql, inserts); // SELECT * FROM users WHERE id = 1

参考文章:

MySQL编码转换防止SQL注入_node-mysql中防止SQL注入相关推荐

  1. mysql编码转换搞定

    mysql编码转换搞定(转) 按照下面做法,终于成功了!庆祝,纪念...... 背景:某个系统的mysql数据库dnname采用默认的latin1字符集,系统升级需要将所有数据转换成utf-8格式,目 ...

  2. mysql 查询编码转换_字符集介绍及mysql数据库编码转换

    一.字符集介绍: 1.ASCII ASCII是英文American Standard Code for Information Interchange的缩写,美国标准信息交换代码是由美国国家标准学会( ...

  3. mysql编码转换工具_mysql编码转换搞定

    按照下面做法,终于成功了!庆祝,纪念...... 背景:某个系统的mysql数据库dnname采用默认的latin1字符集,系统升级需要将所有数据转换成utf-8格式,目标数据库为newdbname( ...

  4. mysql编码转换工具_MySQL GBK→UTF-8编码转换

    MySQL GBK→UTF-8编码转换 2021-01-23 11:20:21483 前言: 第一次写教程,其实算不得教程,只是想总结个转换的手记.如果中间有错误,或者办法不够理想,大家回贴研究下. ...

  5. php mysql 编码转换_PHP编码转换函数应用

    最近写了几个小程序,其中遇到了很多字符编码的问题,在这里总结一下 1.数据库中编码 数据库的编码一般在创建数据库时设置"整理",当然创建表时也需要设置的,而且只要有中文汉字.标点都 ...

  6. mysql命令行执行复杂sql_mysql命令行中执行sql的几种方式总结

    1.直接输入sql执行 MySQL> select now(); +---------------------+ | now() | +---------------------+ | 2013 ...

  7. mysql中sql插入时间_mysql中使用sql语句插入日期时间类型的写法

    [例子如下: select * from ( select rownumber() over() as rownumber, id from associate ) as temp where row ...

  8. access oracle sql语句,在 Access 中使用 SQL 建索引

    时 间:2017-12-29 08:30:39 作 者:摘 要:  一般在Oracle中使用Sql,在Access中使用很少,不过与Oracle的Sql还是有很多相似之处的.以下SQL语句在ACCES ...

  9. sql 时间范围查询_Excel中使用SQL查询,单元格范围最多支持65536行?

    1.先建立一个excel,本人的版本为2016 2.然后向下填充数字,操作为填充--序列 这样生成1-66666的序列 3.使用SQL查询语句,进行查询 使用语句 : select 序列 from [ ...

最新文章

  1. XCode修改工程名注意
  2. java多线程notifyall_Java多线程:线程状态以及wait(), notify(), notifyAll()
  3. MFC中的Document-View结构
  4. GPU Gems2 - 8 使用距离函数的逐像素位移贴图
  5. ie6/7 position relative overflow
  6. javascript数组扁平化处理
  7. Halcon例程学习之距离变换(distance_transform)
  8. Django 添加应用
  9. 天兔(Lepus)监控操作系统(OS)安装配置
  10. 希望我这是最后一次谈SaaS
  11. 全国计算机一级上表格怎么做,全国计算机一级考试word表格制作(2003版)
  12. JAVA获取前一个月的第一天和最后一天
  13. AI创业哪家强?6大选择给你方向!
  14. 【Spark ML】第 2 章: Spark和Spark简介
  15. 让你的Excel完美支持中国农历
  16. 易基因-单细胞甲基化测序单细胞转录组测序
  17. 【CUDA】CUDA9.0+VS2017+win10详细配置
  18. 微信小程序用picker-view 实现时间的选择 及加减
  19. LeetCode in Python-21. Merge Two Sorted Lists 合并两个有序链表
  20. 完整拉起高德地图的代码。自动导航至目的地

热门文章

  1. 改变 CListCtrl、CHeaderCtrl 高度、字体、颜色和背景
  2. 焊接机器人结构设计(毕业论文52页+CAD图纸+CAXA图纸+开题报告+任务书)
  3. Java数组作为方法返回值
  4. 外骨骼机器人(四):步态分析之基本知识
  5. python list/tuple/dict/set/deque的简单比较、优化和时间复杂度(表格)
  6. ios如何解除dns被劫持_iOS监控-DNS劫持
  7. 嵌入空间的概念解释及原理
  8. 计算机软件水平考试哪个比较容易,高手心得:计算机软件水平考试经验谈
  9. CSDN高校俱乐部“新北洋”之行
  10. 【教程】Windows通过注册表方式设置TCP超时时间