Heim >Web-Frontend >js-Tutorial >Ein Artikel, der die SQL-Injection von Node+MySQL erklärt

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

青灯夜游
青灯夜游nach vorne
2022-11-14 20:10:371925Durchsuche

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] || {}
  })
}

上面是登录方法。

最后可以通过 《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] || {}
  })
}

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

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

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

可以看到 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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen