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


Posted by christopher0404 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

Vue.js 學習旅程Mile 13 – List Rendering 列表渲染篇:v-for

Vue.js 學習旅程Mile 13 – List Rendering 列表渲染篇:v-for

[http] 不只是簡單的跨域請求 Preflight Request

[http] 不只是簡單的跨域請求 Preflight Request

Matplotlib / Pandas 資料分析繪圖顯示中文字體入門教學

Matplotlib / Pandas 資料分析繪圖顯示中文字體入門教學


Comments