SQL Injection 的攻擊原理和防範方法


Posted by Wes on 2021-02-28

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();

#Security #SQL Injection #SQL #PHP







Related Posts

[第六週]  CSS  Part2 -  裝飾起來吧

[第六週] CSS Part2 - 裝飾起來吧

v-bind 動態屬性指令

v-bind 動態屬性指令

前端也能玩 Deep learning - 以 p5-deeplearn-js 為例

前端也能玩 Deep learning - 以 p5-deeplearn-js 為例


Comments