Bien que nous n'utiliserons pas directement NodeJS natif pour développer le backend, il faut quand même comprendre l'injection SQL
. SQL注入
还是很有必要的。
本文使用 NodeJS
+ MySQL
对 SQL注入
进行讲解。
SQL注入攻击
是很古老的攻击方式了,自从 web2.0
诞生后就有 SQL注入攻击
。它通常出现在 输入框 、文本域 等前端组件中。在输入的内容里加入 SQL语句
,并一同传给后台。【相关教程推荐:nodejs视频教程】
后台一不小心就会将前端传过来的 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' --
,注意 --
前后都有空格。那密码就可以随便输入了。
最后拼接出来的 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
+ MySQL
pour expliquer l'injection SQL
. et le 🎜champ de texte🎜. Ajoutez une instruction SQL
au contenu d'entrée et transmettez-la ensemble en arrière-plan. [Tutoriels associés recommandés : tutoriel vidéo nodejs🎜]🎜🎜Si l'arrière-plan n'est pas soigné, la face avant -end sera transféré L'instruction SQL
entrante est fusionnée dans sa propre instruction SQL
, et finalement fusionnée dans un code d'attaque. 🎜🎜Des précautions doivent donc être prises, sinon il pourrait y avoir une fuite de données, voire une suppression de la base de données. 🎜users
dans MySQL
pour stocker les noms d'utilisateur et les mots de passe. 🎜🎜Dans la table users
, j'ai créé une donnée : insérer dans les utilisateurs (nom d'utilisateur,
mot de passe, nom réel) des valeurs ('leihou', ' 123', 'Thunder Monkey');
🎜🎜les données signifient : 🎜nom d'utilisateur : 'leihou'
mot de passe : ' 123 '
vrai nom : 'Thunder Monkey'
NodeJS
, j'ai créé J'ai une méthode de connexion🎜rrreee🎜Ce qui précède est la méthode de connexion. 🎜🎜Enfin, vous pouvez créer une interface pour le front-end via la méthode mentionnée dans "NodeJS http demande"🎜 . Puisque la partie interface n’est pas au centre de cet article, je vais la sauter ici (laissez-moi être paresseux). 🎜🎜À ce stade, créez une autre page HTML
, générez grossièrement du contenu, puis utilisez Ajax
pour vous connecter au backend. 🎜🎜Si vous êtes paresseux, vous pouvez directement utiliser postman
pour tester🎜🎜🎜🎜Selon la 🎜méthode de connexion🎜 ci-dessus, vous pouvez savoir que vous pouvez vous connecter avec succès en saisissant le contenu suivant sur le front-end🎜leihou' --
, veuillez noter que --
est utilisé avant et après Il y a des espaces. Ensuite, le mot de passe peut être saisi avec désinvolture. 🎜🎜L'instruction SQL
finale est select username, realname from username='leihou' -- ' et password='aslkfjsaf' ;
🎜🎜Notez que le mot de passe, je l'ai entré avec désinvolture. 🎜🎜Dans MySQL
, --
représente la signification des commentaires. Ainsi, l'instruction ci-dessus devient Interroger les données dont le nom d'utilisateur est leihou
. Naturellement, le mot de passe est contourné. 🎜🎜Le contenu du nom d'utilisateur
saisi ci-dessus contourne la connexion et divulgue les informations. Mais si quelqu’un d’autre souhaite supprimer votre table, les conséquences seront très graves. 🎜🎜Par exemple, saisissez dans la zone de saisie du nom d'utilisateur : leihou'; delete from users --
. 🎜🎜Supprimez directement la table users
. 🎜L'attaque par injection SQL
est vraiment trop ancienne, vieille de plus de dix ans. Les méthodes d’adaptation de base sont donc matures. 🎜🎜Par exemple, transcoder la chaîne transmise depuis le front-end. 🎜🎜Le package de dépendances MySQL
téléchargé à l'aide de NodeJS
fournit cette méthode : escape
. 🎜rrreee🎜La chaîne filtrée à l'aide de la méthode escape
sera échappée. 🎜🎜À ce moment, si le nom d'utilisateur entre leihou' --
, le contenu suivant sera imprimé sur la console backend : 🎜rrreee🎜Vous pouvez voir les guillemets simples après leihou' a été échappé. 🎜🎜Ce qui précède explique comment <code>MySQL
empêche les attaques par injection SQL
. 🎜🎜Pour plus de connaissances sur les nœuds, veuillez visiter : 🎜tutoriel Nodejs🎜 ! 🎜Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!