Rumah  >  Artikel  >  hujung hadapan web  >  Artikel yang menerangkan suntikan SQL Node mysql

Artikel yang menerangkan suntikan SQL Node mysql

青灯夜游
青灯夜游ke hadapan
2022-11-14 20:10:371874semak imbas

Artikel yang menerangkan suntikan SQL Node mysql

Walaupun kami tidak akan terus menggunakan NodeJS asli untuk membangunkan bahagian belakang, ia masih perlu untuk memahami SQL注入.

Artikel ini menggunakan NodeJS MySQL untuk menerangkan SQL注入.

SQL注入攻击 ialah kaedah serangan yang sangat lama, ia telah wujud sejak web2.0 dilahirkan. Ia biasanya muncul dalam komponen bahagian hadapan seperti SQL注入攻击kotak input dan medan teks. Tambahkan pada kandungan input dan hantarkannya ke latar belakang bersama-sama. [Tutorial berkaitan yang disyorkan: SQL语句tutorial video nodejs]

Halaman belakang secara tidak sengaja akan menyambung

yang dihantar dari hujung hadapan ke SQL语句nya sendiri dan akhirnya menyambungkannya menjadi kod serangan . SQL语句

Jadi langkah berjaga-jaga mesti diambil, jika tidak mungkin berlaku kebocoran data atau pemadaman pangkalan data.

Demonstrasi suntikan SQL

Ambil log masuk sebagai contoh, saya menambah jadual

dalam MySQL untuk menyimpan nama pengguna dan kata laluan. users

Dalam jadual

, saya mencipta sekeping data: userskata laluaninsert into users (username, , realname) values ('leihou', '123', '雷猴');

Data bermaksud:

  • username: 'leihou'
  • password: '123'
  • realname: '雷猴'
Pada masa ini, dalam

latar belakang, saya mencipta kaedah log masuk 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] || {}
  })
}
Di atas adalah kaedah log masuk.

Akhir sekali, anda boleh mencipta antara muka untuk bahagian hadapan melalui kaedah yang disebut dalam

"Permintaan http NodeJS". Oleh kerana bahagian antara muka bukan fokus artikel ini, saya akan melangkaunya di sini (biar saya malas).

Pada masa ini, buat satu lagi halaman

, kira-kira hasilkan beberapa kandungan, kemudian gunakan HTML untuk berhubung dengan bahagian belakang. Ajax

Jika anda malas, anda boleh terus menggunakan ujian

postman

Artikel yang menerangkan suntikan SQL Node mysql

Mengikut

Kaedah Log masuk di atas kita boleh tahu bahawa input bahagian hadapan adalah seperti berikut Kandungan akan membolehkan anda log masuk dengan jayanya

    Nama pengguna: leihou
  • Kata Laluan: 123
Tetapi jika pada masa ini, nama pengguna yang dimasukkan ialah

, Perhatikan bahawa terdapat ruang sebelum dan selepas leihou' -- . Kemudian kata laluan boleh dimasukkan secara santai. --

Pernyataan terakhir

yang disambungkan ialah SQLselect username, realname from users where username='leihou' -- ' and password='aslkfjsaf';

Perhatikan bahawa saya memasukkan kata laluan secara santai.

Dalam

, MySQL mewakili maksud anotasi. Maka pernyataan di atas menjadi -- . Sememangnya, kata laluan dipintas. 查询 username 为 leihou 的那条数据

Kandungan

yang dimasukkan di atas memintas maklumat log masuk dan membocorkan. Tetapi jika orang lain mahu memadamkan jadual anda, akibatnya akan menjadi sangat serius. username

Sebagai contoh, masukkan:

dalam kotak input nama pengguna. leihou'; delete from users; --

secara langsung memadamkan senarai

. users

Kaedah pencegahan

Ia benar-benar terlalu lama, lebih daripada sepuluh tahun. Jadi kaedah daya tindak asas adalah matang. SQL注入攻击

Sebagai contoh, alih kod rentetan yang dihantar dari hujung hadapan.

Gunakan

untuk memuat turun pakej pergantungan NodeJS Kaedah ini disediakan: 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] || {}
  })
}
Rentetan yang ditapis menggunakan kaedah

akan terlepas. escape

Jika nama pengguna memasukkan

pada masa ini, kandungan berikut akan dicetak pada konsol bahagian belakang: leihou' --

select username, realname from users where username='leihou\' -- ' and password='123345';
Anda boleh melihat bahawa petikan tunggal selepas

ialah melarikan diri. leihou'

Di atas adalah cara untuk

mencegah MySQL. SQL注入攻击

Untuk lebih banyak pengetahuan berkaitan nod, sila lawati:

tutorial nodejs!

Atas ialah kandungan terperinci Artikel yang menerangkan suntikan SQL Node mysql. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:juejin.cn. Jika ada pelanggaran, sila hubungi admin@php.cn Padam