NodeJS|NodeJS mysql需要注意sql注入
本文简介
点赞 + 关注 + 收藏 = 学会了
虽然现在不会直接使用 原生NodeJS 的方式开发后台,但了解一下 SQL注入
还是很有必要的。
本文使用 NodeJS
+ MySQL
对 SQL注入
进行讲解。
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.escapeconst 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注入攻击
的方法。推荐阅读 《NodeJS http请求》
《NodeJS 5分钟 连接MySQL 增删改查》
《NodeJS Stream入门》
《NodeJS 操作cookie》
《NodeJS 5分钟 连接 Redis 读写操作》
【NodeJS|NodeJS mysql需要注意sql注入】《NodeJS 读写文件》
点赞 + 关注 + 收藏 = 学会了
推荐阅读
- 上海|上海解封一月记:一座巨型城市的待机和重启都需要时间
- 上传jar到私服,Generate a POM file with these coordinates 需要勾选吗()
- 故障分析 | MySQL 耗尽主机内存一例分析
- 服务端nodejs抓取jsonp接口数据实现示例
- 想进阿里必须啃透的12道MySQL面试题
- 晨读感悟|晨读感悟 快速思考,你只需要做一件事。
- mySQL|mySQL count多个表的数据实例详解
- MySQL中json_extract()函数的使用实例
- mysql5.6|mysql5.6 解析JSON字符串方式(支持复杂的嵌套格式)
- 荐书|荐书 | 孤独小说家(你只需要再站起来一次)