SQL 注入
SQL 注入利用了未能驗證使用者輸入的 Web 應用程式。駭客可以透過 Web 應用程式惡意傳遞 SQL 命令,由後端資料庫執行。
SQL 注入可以未經授權訪問資料庫或直接從資料庫檢索資訊。許多資料洩露都是由 SQL 注入造成的。

工作原理

輸入使用者名稱和密碼後,在 GUI 背後,SQL 查詢的工作方式如下
sql
"SELECT Count(*) FROM Users WHERE Username=' " + txt.User.Text+" ' AND Password=' "+ txt.Password.Text+" ' ";
現在假設使用者輸入使用者名稱:admin 和密碼:passwd123,所以點選登入按鈕後,SQL 查詢將如下執行
sql
"SELECT Count(*) FROM Users WHERE Username=' admin ' AND Password=' passwd123 ' ";
如果憑據正確,則允許使用者登入,因此這是一種非常簡單(因此不安全)的機制。駭客利用這種不安全性來獲得未經授權的訪問。
駭客使用一個稱為“魔法字串”的簡單字串,例如
使用者名稱:admin
密碼:anything 'or'1'='1
點選登入按鈕後,SQL 查詢將如下工作
sql
"SELECT Count(*) FROM Users WHERE Username=' admin ' AND Password=' anything 'or'1'='1 ' ";
請仔細檢視上述查詢的密碼部分。
Password=' anything 'or'1'='1 '
密碼不是“anything”,因此 password=anything 的結果是 FALSE,但“1”='1' 是一個 TRUE 語句,因此返回 TRUE 值。最後,由於 OR 運算子,值 (FALSE OR TRUE) 為 TRUE,因此身份驗證成功繞過。僅僅由於一個簡單的字串(魔法字串),整個資料庫就被攻破了。
如何預防
在執行使用者憑據查詢之前,進行如下更改
php
$id = $_GET["id"]
(1) $id = stripslashes($id)
(2) $id = mysql_real_escape_String($id)
因此,由於 (1) 輸入字串中的每個單引號 (') 都被替換為雙引號 ("),並且由於 (2) 在每個 (') 之前添加了 (/)。修改後的魔法字串無法繞過身份驗證,您的資料庫保持安全。