世界热资讯!一文讲解Node+mysql对SQL注入

时间:2022-11-14 19:52:41       来源:转载


(资料图)

虽然现在不会直接使用 原生NodeJS的方式开发后台,但了解一下 SQL注入还是很有必要的。

本文使用 NodeJS+ MySQLSQL注入进行讲解。

SQL注入攻击是很古老的攻击方式了,自从 web2.0诞生后就有 SQL注入攻击。它通常出现在 输入框文本域等前端组件中。在输入的内容里加入 SQL语句,并一同传给后台。【相关教程推荐:nodejs视频教程】

后台一不小心就会将前端传过来的 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注入攻击的方法。

更多node相关知识,请访问:nodejs 教程!

以上就是一文讲解Node+mysql对SQL注入的详细内容,更多请关注php中文网其它相关文章!

关键词: 连接数据库 开始连接 相关文章