一文讲解Node+mysql对SQL注入

青灯夜游
Lepaskan: 2022-11-14 20:10:37
ke hadapan
1800 orang telah melayarinya

一文讲解Node+mysql对SQL注入

虽然现在不会直接使用原生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] || {} }) }
Salin selepas log masuk

上面是登录方法。

最后可以通过《NodeJS http请求》里提到的方法创建一个接口给前端。由于接口部分不是本文重点,所以这里打算略过(让我偷懒吧)。

此时再创建一个HTML页面,大概生成一下内容,然后使用Ajax与后端对接。

如果你懒的话可以直接使用postman测试

01.png

根据上面的登录方法可以得知,前端输入以下内容就可以登录成功

  • 用户名: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] || {} }) }
Salin selepas log masuk

使用escape方法过滤后的字符串会被转义。

此时如果用户名输入leihou' --,在后端控制台会打印出如下内容:

select username, realname from users where username='leihou\' -- ' and password='123345';
Salin selepas log masuk

可以看到leihou'后面的单引号被转义了。

以上就是MySQL防范SQL注入攻击的方法。

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

Atas ialah kandungan terperinci 一文讲解Node+mysql对SQL注入. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:juejin.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!