node+mysql中防止sql注入

1,730 阅读1分钟

在node环境中操作数据库时,我们需要对用户输入的内容做编码处理,在客户端我们可以使用encode对内容进行编码;在服务端我们也要做一些编码处理,介绍以下常用几种方法,如果有新方法,欢迎大家留言补充:

第一种:使用connection.query(sql, values)的查询参数占位符

sql语句中使用?作为查询参数占位符,值以数组的形式作为values传入。代码使用如下:

const connection = mysql.createConnection({
    host     : 'xxxxxx'
    user     : 'xxxxxx',
    password : 'xxxxxx',
    database : 'xxxxxx'
});

connection.query('update tbl_module set module_status = ? where id = ?', [moduleStatus, id], ( err, rows) => {});

那为什么这样调用会预防sql注入呢?先查看mysql源码:

  1. mysql建立连接

image.png

image.png

  1. 查看Connection.js

image.png

如果返回sql值,则执行format()方法。

image.png

  1. 查看SqlString.format()方法

image.png

image.png

  1. 查看SqlString.escapeId()和SqlString.escape()

image.png

image.png

  1. 使用参数占位符,并将values传入,其内部会调用SqlString.escape()来转换。

方法2: 对传入的参数调用mysql.escape()来过滤

代码演示如下:

const connection = mysql.createConnection({
    host     : 'xxxxxx'
    user     : 'xxxxxx',
    password : 'xxxxxx',
    database : 'xxxxxx'
});

connection.query(`update tbl_module set module_status = ${mysql.escape(status)} where id = ${mysql.escape(id)}`);

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

  • mysql.escape(param)
  • connection.escape(param)
  • pool.escape(param)

这种方式可以对输入参数做精确控制。

参考资料