這是在講關於一名叫 Koa 的全端勇士傳說-MySQL篇-SQL injection

前言

學習完畢基礎的 SQL 指令之後,接下來要來講一下關於 SQL injection,SQL injection 又是什麼?

SQL injection

SQL injection 又稱 SQL 注入 or SQL 隱碼、SQL 注碼等,通常這個問題是非常危險的,稍後會寫一些範例來示範

那個 SQL injection 主要會發生在什麼地方?與 SQL 指令的查詢、新增、更新以及刪除等動作有關係,通常會使用到分號、註解等不正常的方式塞入至 SQL 指令內,而這種行為就是 SQL injection

小範例

假設我們網站上某個地方所使用的 SQL 指令是這樣子

1
SELECT * FROM testtable WHERE name="tom" AND t_id = 1

但是在實際 JavaScript 還是其他語言例如 PHP,都是使用變數來傳入 nameid

1
2
3
var a = "tom"
var b = 1
console.log(`SELECT * FROM testtable WHERE name=${a} AND t_id = ${b}`);

那麼丟到 SQL 上就會變成 SELECT * FROM testtable WHERE name='tom' AND t_id = 1,那麼 SQL injection 又是怎麼回事?

當變數傳入的是這樣子

1
2
3
var a = "tom'#"
var b = 1
console.log(`SELECT * FROM testtable WHERE name=${a} AND t_id = ${b}`);

那麼輸出結果就會變成

1
SELECT * FROM testtable WHERE name='tom'#' AND t_id = 1

那你一定會問這會有什麼影響?讓我們丟進去 SQL 中就知道了

原本正常我們只會找到一個 tom,而且是小寫的 tom

小寫的 tom

當你被 SQL injection 之後就會發生這種狀況

SQL injection

你會發現全部的 TOM 都被撈出來了,那麼這就是所謂的 SQL injection,而這只是其中一個範例而已

這危險程度非常的高,可以導致駭客不需要任何帳號密碼就可以取得帳號,所以 SQL injection 又被稱為填空遊戲,危險程度可以看這邊 Wiki

JavaScript 避免方法

由於本篇是在講 Koa.js,所以只會講關於 JavaScript 的解決方式唷~

一般來講就是使用參數話來防禦 SQL 注入的問題,舉一個最簡單的範例如下

1
2
3
var a = "tom'#"
var b = 1
var sql = connection.query(`SELECT * FROM testtable WHERE name=? AND t_id=?`, ['tom', 1]);

當然方法還有很多種,這邊就直接提供 連結參考

接下來就準備進入實作階段哩~