node

38次阅读
没有评论

共计 2125 个字符,预计需要花费 6 分钟才能阅读完成。

自动写代码机器人,免费开通

node-mysql 中怎么防止 SQL 注入,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面丸趣 TV 小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

SQL 注入简介

SQL 注入是比较常见的网络攻击方式之一,它不是利用操作系统的 BUG 来实现攻击,而是针对程序员编程时的疏忽,通过 SQL 语句,实现无帐号登录,甚至篡改数据库。

node-mysql 中防止 SQL 注入

为了防止 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

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注丸趣 TV 行业资讯频道,感谢您对丸趣 TV 的支持。

向 AI 问一下细节

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-04发表,共计2125字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)