乐趣区

关于前端: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 注入攻打 的办法。

举荐浏览

👍《NodeJS http 申请》

👍《NodeJS 5 分钟 连贯 MySQL 增删改查》

👍《NodeJS Stream 入门》

👍《NodeJS 操作 cookie》

👍《NodeJS 5 分钟 连贯 Redis 读写操作》

👍《NodeJS 读写文件》
点赞 + 关注 + 珍藏 = 学会了

退出移动版