写点什么

NodeJS mysql 需要注意 sql 注入 🎈

作者:德育处主任
  • 2022 年 6 月 21 日
  • 本文字数:1651 字

    阅读完需:约 5 分钟

NodeJS mysql需要注意sql注入 🎈

本文简介

点赞 + 关注 + 收藏 = 学会了


虽然现在不会直接使用 原生 NodeJS 的方式开发后台,但了解一下 SQL注入 还是很有必要的。


本文使用 NodeJS + MySQLSQL注入 进行讲解。


SQL注入攻击 是很古老的攻击方式了,自从 web2.0 诞生后就有 SQL注入攻击。它通常出现在 输入框文本域 等前端组件中。在输入的内容里加入 SQL语句 ,并一同传给后台。


后台一不小心就会将前端传过来的 SQL语句 拼接到自己的 SQL语句 中,最终拼接成一段攻击代码。


所以必须加以预防,不然有可能出现数据泄露,甚至被删库等可能。


SQL 注入演示

以登录为例,我在 MySQL 中添加一个 users 表,里面存储用户名和密码。


users 表中,我创建了一条数据:insert into users (username, password, realname) values ('leihou', '123', '雷猴');


数据的意思是:


  • username: 'leihou'

  • password: '123'

  • realname: '雷猴'


此时,在 NodeJS 后台,我创建了一个登录方法


const mysql = require('mysql')
// 创建连接对象const con = mysql.createConnection({ host: 'localhost', // 地址 user: 'root', // 连接数据库的用户 password: '123456', // 连接数据库的密码 port: '3306', // 默认端口 database: 'testdb' // 数据库名})
// 开始连接con.connect()
// 统一执行 sql 的函数function exec(sql) { const promise = new Promise((resolve, reject) => { con.query(sql, (err, result) => { if (err) { reject(err) return } resolve(result) }) }) return promise}
// 登录方法const login = (username, password) => { const sql = ` select username, realname from users where username='${username}' and password='${password}'; `
console.log(sql) return exec(sql).then(rows => { return rows[0] || {} })}
复制代码


上面是登录方法。


最后可以通过 《NodeJS http 请求》 里提到的方法创建一个接口给前端。由于接口部分不是本文重点,所以这里打算略过(让我偷懒吧)。


此时再创建一个 HTML 页面,大概生成一下内容,然后使用 Ajax 与后端对接。


如果你懒的话可以直接使用 postman 测试



根据上面的 登录方法 可以得知,前端输入以下内容就可以登录成功


  • 用户名:leihou

  • 密码:123


但如果此时,用户名输入的是 leihou' -- ,注意 -- 前后都有空格。那密码就可以随便输入了。


最后拼接出来的 SQL 语句是 select username, realname from users where username='leihou' -- ' and password='aslkfjsaf';


注意,密码我是随便输入的。


MySQL 里, -- 代表注释的意思。所以上面的语句就变成 查询 username 为 leihou 的那条数据 。自然就绕过了密码。


上面输入的 username 的内容绕过登录,泄露了信息。但如果别人要删掉你的表,那后果就非常严重了。


比如在用户名输入框内输入:leihou'; delete from users; --


直接就把 users 表给删掉了。


防止方法

SQL注入攻击 实在太古老了,有十几年历史了。所以基本的应对方法都成熟了。


比如将前端传过来的字符串进行转码。


使用 NodeJS 下载的 MySQL 依赖包里就提供了这个方法:escape


// 省略部分代码const mysql = require('mysql')
// 省略创建连接对象// 省略开始连接// 统一执行 sql 的函数 exec 方法
const escape = mysql.escape
const login = (username, password) => { username = escape(username) password = escape(password) const sql = ` select username, realname from users where username=${username} and password=${password}; `
console.log(sql) return exec(sql).then(rows => { return rows[0] || {} })}
复制代码


使用 escape 方法过滤后的字符串会被转义。


此时如果用户名输入 leihou' -- ,在后端控制台会打印出如下内容:


select username, realname from users where username='leihou\' -- ' and password='123345';
复制代码


可以看到 leihou' 后面的单引号被转义了。


以上就是 MySQL 防范 SQL注入攻击 的方法。

发布于: 9 小时前阅读数: 5
用户头像

反派 2019.03.19 加入

用键盘绣花

评论

发布
暂无评论
NodeJS mysql需要注意sql注入 🎈_Node_德育处主任_InfoQ写作社区