Obwohl wirnatives NodeJSnicht direkt zur Entwicklung des Backends verwenden werden, ist es dennoch notwendig,SQL-Injection
zu verstehen.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
, um die
SQL-Injection
zu erklären.
und Textfeld. Fügen Sie dem Eingabeinhalt eine
SQL-Anweisung
hinzu und übergeben Sie sie gemeinsam an den Hintergrund. [Empfohlene verwandte Tutorials:
nodejs-Video-Tutorial]Wenn der Hintergrund nicht sorgfältig ist, ist die Vorderseite -end wird übertragen Die eingehendeSQL-Anweisung
wird in eine eigeneSQL-Anweisung
gespleißt und schließlich in einen Angriffscode gespleißt. Es müssen also Vorkehrungen getroffen werden, sonst kann es zu Datenlecks oder sogar zur Löschung der Datenbank kommen.users
-Tabelle inMySQL
hinzu, um Benutzernamen und Passwörter zu speichern. In der Tabelleusers
habe ich ein Datenelement erstellt:in user (username,
password, realname) Werte ('leihou', ' einfügen) 123', 'Thunder Monkey');
Daten bedeuten:
Benutzername: 'leihou'
Passwort: ' 123 '
realname: 'Thunder Monkey'
NodeJS
-Hintergrund , Ich habe eine Anmeldemethode erstelltrrreeeDas Obige ist die Anmeldemethode. Schließlich können Sie mit der in
"NodeJS http" genannten Methode eine Schnittstelle für das Frontend erstellen Anfrage" . Da der Schnittstellenteil nicht im Mittelpunkt dieses Artikels steht, werde ich ihn hier überspringen (lassen Sie mich faul sein). Erstellen Sie zu diesem Zeitpunkt eine weitereHTML
-Seite, generieren Sie grob einige Inhalte und verwenden Sie dannAjax
, um eine Verbindung mit dem Backend herzustellen. Wenn Sie faul sind, können Siepostman
direkt zum Testen verwendenleihou' --
eingegeben wird, Bitte beachten Sie, dass--
vor und nach Leerzeichen verwendet wird. Anschließend kann das Passwort zwanglos eingegeben werden. Die letzte gespleißteSQL
-Anweisung istselect username, realname from users where username='leihou' -- ' and password='aslkfjsaf';
Beachten Sie das Das Passwort habe ich beiläufig eingegeben. InMySQL
stellt--
die Bedeutung von Kommentaren dar. Die obige Anweisung wird also zuFragen Sie die Daten ab, deren Benutzername leihou lautet
. Das Passwort wird selbstverständlich umgangen. Der oben eingegebene Inhalt vonBenutzername
umgeht die Anmeldung und gibt Informationen preis. Wenn jedoch jemand anderes Ihre Tabelle löschen möchte, werden die Folgen sehr schwerwiegend sein. Geben Sie beispielsweise in das Eingabefeld für den Benutzernamen ein:leihou'; Löschen Sie die Tabelle users
direkt.Präventionsmethoden
SQL-Injection-Angriff
ist wirklich zu alt, mehr als zehn Jahre alt. Die grundlegenden Bewältigungsmethoden sind also ausgereift. Zum Beispiel die Transkodierung der vom Frontend übergebenen Zeichenfolge. Das mitNodeJS
heruntergeladeneMySQL
-Abhängigkeitspaket bietet diese Methode:escape
. rrreeeDie mit der Methodeescape
gefilterte Zeichenfolge wird mit Escapezeichen versehen. Wenn der Benutzername zu diesem Zeitpunktleihou' --
eingibt, wird der folgende Inhalt auf der Backend-Konsole gedruckt: rrreeeSie können die einfachen Anführungszeichen nachleihou' wurde maskiert. Das Obige zeigt, wie MySQL
SQL-Injection-Angriffe
verhindert. Weitere Informationen zu Knoten finden Sie unter: nodejs-Tutorial!
Das obige ist der detaillierte Inhalt vonEin Artikel, der die SQL-Injection von Node+MySQL erklärt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!