node.js極速入門課程:進入學習
雖然現在不會直接使用 原生NodeJS 的方式開發後臺,但瞭解一下 SQL隱碼攻擊
還是很有必要的。
本文使用 NodeJS
+ MySQL
對 SQL隱碼攻擊
進行講解。
SQL隱碼攻擊
是很古老的攻擊方式了,自從 web2.0
誕生後就有 SQL隱碼攻擊
。它通常出現在 輸入框 、文字域 等前端元件中。在輸入的內容里加入 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] || {}
})
}
登入後複製
上面是登入方法。
最後可以通過 裡提到的方法建立一個介面給前端。由於介面部分不是本文重點,所以這裡打算略過(讓我偷懶吧)。
此時再建立一個 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隱碼攻擊
的方法。
更多node相關知識,請存取:!
以上就是一文講解Node+mysql對SQL隱碼攻擊的詳細內容,更多請關注TW511.COM其它相關文章!