Heim > Web-Frontend > js-Tutorial > Hauptteil

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

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

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

Obwohl wir natives NodeJS nicht direkt zur Entwicklung des Backends verwenden werden, ist es dennoch notwendig, SQL-Injection zu 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-Injection zu erklären.

SQL-Injection-Angriff ist eine sehr alte Angriffsmethode. Seit der Geburt von web2.0 gibt es SQL-Injection-Angriffe. Es erscheint normalerweise in Frontend-Komponenten wie Eingabefeld

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 eingehende SQL-Anweisung wird in eine eigene SQL-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. 🎜

🎜SQL-Injection-Demonstration🎜

🎜 Am Beispiel der Anmeldung füge ich eine users-Tabelle in MySQL hinzu, um Benutzernamen und Passwörter zu speichern. 🎜🎜In der Tabelle users 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'
🎜Zu diesem Zeitpunkt im NodeJS-Hintergrund , Ich habe eine Anmeldemethode erstellt🎜rrreee🎜Das 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 weitere HTML-Seite, generieren Sie grob einige Inhalte und verwenden Sie dann Ajax, um eine Verbindung mit dem Backend herzustellen. 🎜🎜Wenn Sie faul sind, können Sie postman direkt zum Testen verwenden🎜🎜Ein Artikel, der die SQL-Injection von Node+MySQL erklärt🎜🎜Gemäß 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 als leihou' -- eingegeben wird, Bitte beachten Sie, dass -- vor und nach Leerzeichen verwendet wird. Anschließend kann das Passwort zwanglos eingegeben werden. 🎜🎜Die letzte gespleißte SQL-Anweisung ist select username, realname from users where username='leihou' -- ' and password='aslkfjsaf';🎜🎜Beachten Sie das Das Passwort habe ich beiläufig eingegeben. 🎜🎜In MySQL stellt -- die Bedeutung von Kommentaren dar. Die obige Anweisung wird also zu Fragen Sie die Daten ab, deren Benutzername leihou lautet. Das Passwort wird selbstverständlich umgangen. 🎜🎜Der oben eingegebene Inhalt von Benutzername 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 <code>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 mit NodeJS heruntergeladene MySQL-Abhängigkeitspaket bietet diese Methode: escape. 🎜rrreee🎜Die mit der Methode escape gefilterte Zeichenfolge wird mit Escapezeichen versehen. 🎜🎜Wenn der Benutzername zu diesem Zeitpunkt leihou' -- eingibt, wird der folgende Inhalt auf der Backend-Konsole gedruckt: 🎜rrreee🎜Sie können die einfachen Anführungszeichen nach leihou' wurde maskiert. 🎜🎜Das Obige zeigt, wie <code>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!

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
Beliebte Tutorials
Mehr>
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!