SQL Injection 是使用 SQL 語法作為輸入的內容。當程式設計忽略字元檢查,輸入的內容就會被當成 SQL 指令來執行,進而存取、竄改資料庫的數據,或者破壞資料庫。通常出現在要求使用者填入表單時,是一種常見的攻擊手法,被俗稱為駭客的填字遊戲。
攻擊原理
假設網站登入驗證的 SQL 查詢語法為
SELECT * FROM `users` WHERE `username` = $user_name AND `password` = $pswd
使用者惡意填入
$user_name = '' OR 1 = 1
$pswd = '' OR 1 = 1
導致原本的 SQL 查詢語法變成
SELECT * FROM `users` WHERE `username` = '' OR 1 = 1 AND `password` = '' OR 1 = 1
實際上執行的 SQL 指令會是
SELECT * FROM `users`
因此就算沒有帳號、密碼,也可以登入網站
防範方法
在 PHP 中可以透過 Prepared Statements 將原本使用字串拼接的部分,改為使用參數傳入值,資料庫不會將參數的內容視為 SQL 指令的一部份來執行,藉此來避免 SQL Injection。
$stmt = $mysqli->prepare("SELECT * FROM `users` WHERE `username` = ? AND `password` = ?");
$stmt->bind_param('ss', $username, $password);
$stmt->execute();