Node.js 解决sql注入问题

这段时间维护Node.js编写的项目,发现登陆SQL注入问题。经过一番折腾解决了这个问题,现记录如下:

一、问题描述 

const crypto = require('crypto');
const conn = require('../../libs/Conn');
const mysql = require('mysql');

module.exports = async function (params) {
    let hash = crypto.createHash('sha256');
    let login_name = params.login_name;
    let password = hash.update(params.password).digest('hex');
    let sql = `SELECT uf.* FROM user_file uf WHERE uf.login_name = '${login_name}' AND uf.password = '${password}' AND
              uf.delete_sign = 1;
        `;
    let user = (await conn(sql)).shift();
    return user;
};

这样的方式很容易被人在动态参数中加入特殊字符产生sql注入,威胁数据库的安全。

如果 login_name 输入'or'1'='1,SQL语句会变成  uf.login_name = '' or '1' = '1' AND uf.password = ' ' 

也就是说不需要知道登录名,只要输密码就可以。


二、解决方案

如果对参数使用escape,就能将参数中的特殊字符进行转义,防止sql的注入。

WHERE uf.login_name = `+ mysql.escape(login_name) +` AND uf.password = `+ mysql.escape(password) +` 

三、拓展

   3.1 使用escape()对传入参数进行编码

mysql.escape(param)

connection.escape(param)

pool.escape(param)

  3.2 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错误。

参考:https://blog.csdn.net/lin_tuer/article/details/54809330

要将注册页面中的用户信息插入到SQL Server数据库中,你可以使用Node.js来编写后端代码,并使用相应的SQL Server驱动程序来连接和操作数据库。 首先,确保你已经安装了Node.jsSQL Server,并在项目目录下创建一个`package.json`文件来管理依赖项。 1. 安装所需的依赖项: 使用以下命令安装`mssql`包,这是一个用于连接和操作SQL Server数据库的Node.js驱动程序。 ``` npm install mssql ``` 2. 在你的Node.js代码中导入所需的模块和配置数据库连接: ```javascript const sql = require('mssql'); const config = { user: 'your_username', password: 'your_password', server: 'your_server', database: 'your_database', options: { encrypt: true // 如果需要,请启用加密连接 } }; ``` 3. 在注册页面处理用户提交的表单数据时,使用以下代码将用户信息插入到SQL Server数据库中: ```javascript // 假设你从注册页面接收到了以下用户信息 const { username, email, password } = req.body; // 连接数据库并执行插入操作 sql.connect(config, (err) => { if (err) { console.log(err); return; } const request = new sql.Request(); request.query(`INSERT INTO Users (username, email, password) VALUES ('${username}', '${email}', '${password}')`, (err, result) => { if (err) { console.log(err); return; } console.log('用户信息已成功插入数据库'); }); }); ``` 请注意,上述代码仅为示例,应根据你的数据库表结构和需求进行相应的修改。另外,为了防止SQL注入攻击,请确保对用户输入的数据进行适当的验证和转义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值