zoukankan      html  css  js  c++  java
  • node-mysql中防止SQL注入

    备注: 本文针对mysqljs/mysql


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

    参考文章:

    1https://github.com/mysqljs/mysql

    2http://itbilu.com/nodejs/npm/NyPG8LhlW.html

    备注:Node.js与MySQL交互操作有很多库,具体可以在 https://www.npmjs.org/search?q=mysql查看。

    Ref:http://www.dengzhr.com/node-js/877
  • 相关阅读:
    VysorPro助手
    Play 2D games on Pixel running Android Nougat (N7.1.2) with Daydream View VR headset
    Play 2D games on Nexus 6P running Android N7.1.1 with Daydream View VR headset
    Native SBS for Android
    ADB和Fastboot最新版的谷歌官方下载链接
    How do I install Daydream on my phone?
    Daydream Controller手柄数据的解析
    蓝牙BLE传输性能及延迟分析
    VR(虚拟现实)开发资源汇总
    Android(Java)控制GPIO的方法及耗时分析
  • 原文地址:https://www.cnblogs.com/rysinal/p/8350783.html
Copyright © 2011-2022 走看看