---
# System prepended metadata

title: SQL Injection 的攻擊原理以及防範方法
tags: [網路安全]

---

# SQL Injection 的攻擊原理以及防範方法
###### tags: `網路安全`
### 攻擊原理
輸入特定含有 sql 語法的資料，讓 sql query 內容被竄改，達到符合攻擊目的。
例如以下範例：
```sql=
SELECT * FROM hati8haha_users WHERE username = $username AND password = $password
```
正常情況下變數 `$username` 與 `$password` 會帶入使用者輸入的資料，若有符合條件才會列出。
但若將 `$password` 替換成 `' OR 1=1 #` 那麼就會執行以下 sql query
```sql=
SELECT * FROM hati8haha_users WHERE username = 'username' AND password = '' OR 1=1 #'
```
因為 `OR 1=1`，因此無論輸入任何帳號密碼都可以取得身分認證成功登入。

### 防範方法：Prepared statement
將傳進去的資料用編譯後的參數替代，不會直接用原始資料進行 sql query

php 的 prepared statement 範例：
```php=
$sql = "insert into comments(nickname, content) values(?,?)";
$stmt = $conn->prepare($sql);
$stmt->bind_param('ss', $nickname, $content);
$result = $stmt->execute();
if (!$result) {
  die($conn->error);
}
$result = $stmt->get_result()
```