Ein Artikel, der die SQL-Injection von Node+MySQL erklärt

青灯夜游
Freigeben: 2022-11-14 20:10:37
nach vorne
1811 Leute haben es durchsucht

Ein Artikel, der die SQL-Injection von Node+MySQL erklärt

Obwohl wirnatives NodeJSnicht direkt zur Entwicklung des Backends verwenden werden, ist es dennoch notwendig,SQL-Injectionzu verstehen.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] || {} }) }
Nach dem Login kopieren

上面是登录方法。

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

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

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

Ein Artikel, der die SQL-Injection von Node+MySQL erklärt

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

  • 用户名: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] || {} }) }
Nach dem Login kopieren

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

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

select username, realname from users where username='leihou\' -- ' and password='123345';
Nach dem Login kopieren

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

以上就是MySQL防范SQL注入攻击

Dieser Artikel verwendet NodeJS+ MySQL, um die SQL-Injectionzu erklären.

SQL-Injection-Angriffist eine sehr alte Angriffsmethode. Seit der Geburt vonweb2.0gibt esSQL-Injection-Angriffe. Es erscheint normalerweise in Frontend-Komponenten wieEingabefeld

und Textfeld. Fügen Sie dem Eingabeinhalt eine SQL-Anweisunghinzu 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-Anweisungwird in eine eigeneSQL-Anweisunggespleiß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.

SQL-Injection-Demonstration

Am Beispiel der Anmeldung füge ich eineusers-Tabelle inMySQLhinzu, um Benutzernamen und Passwörter zu speichern. In der Tabelleusershabe 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'
Zu diesem Zeitpunkt imNodeJS-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 Siepostmandirekt zum Testen verwendenEin Artikel, der die SQL-Injection von Node+MySQL erklärtGemäß der oben genannten Anmeldemethode können Sie feststellen, dass Sie sich erfolgreich anmelden können, indem Sie den folgenden Inhalt im Frontend eingeben
  • Benutzername: leihou
  • Passwort: 123
Aber wenn zu diesem Zeitpunkt der Benutzername alsleihou' --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. InMySQLstellt--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 vonBenutzernameumgeht 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 usersdirekt.

Präventionsmethoden

SQL-Injection-Angriffist 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 mitNodeJSheruntergeladeneMySQL-Abhängigkeitspaket bietet diese Methode:escape. rrreeeDie mit der Methodeescapegefilterte 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 MySQLSQL-Injection-Angriffeverhindert. 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!

Verwandte Etiketten:
Quelle:juejin.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!