本文简介
点赞 + 关注 + 珍藏 = 学会了
尽管当初不会间接应用 原生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 读写文件》
点赞 + 关注 + 珍藏 = 学会了