本文简介
点赞 + 关注 + 珍藏 = 学会了
尽管当初不会间接应用 原生 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.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 注入攻打
的办法。
举荐浏览
👍《NodeJS http 申请》
👍《NodeJS 5 分钟 连贯 MySQL 增删改查》
👍《NodeJS Stream 入门》
👍《NodeJS 操作 cookie》
👍《NodeJS 5 分钟 连贯 Redis 读写操作》
👍《NodeJS 读写文件》
点赞 + 关注 + 珍藏 = 学会了