本文简介

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


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