魯斯前端布魯斯前端

文章中英模式

布魯斯前端面試題目 - SQL注入攻擊詳解

深入解析SQL注入攻擊原理、種類與防禦機制。了解如何防範SQL注入攻擊,保護Web應用數據庫安全。

影片縮圖

懶得看文章?那就來看影片吧

SQL注入攻擊是什麼?

SQL注入是一種攻擊者通過在輸入欄位中插入惡意SQL代碼,使應用程序執行未授權SQL命令的安全漏洞。當應用直接將用戶輸入拼接到SQL查詢中而不進行過濾時,就會出現這種漏洞。

正常登入流程:

// 用戶輸入
用戶名: bruce
密碼: 123456

// 生成的SQL
SELECT * FROM users 
WHERE username = 'bruce' 
AND password = '123456'

SQL注入攻擊:

// 用戶輸入
用戶名: admin' --
密碼: 任意內容

// 生成的SQL
SELECT * FROM users 
WHERE username = 'admin' --' 
AND password = '任意內容'

-- 是SQL註釋,使密碼檢查被忽略

⚠️ SQL注入攻擊可能導致:

  • 1. 未授權訪問敏感數據(用戶資料、信用卡號等)
  • 2. 繞過身份認證,以他人身份登入
  • 3. 修改或刪除數據庫中的數據
  • 4. 執行管理操作(如刪除整個數據表)
  • 5. 在某些情況下獲取服務器控制權

前端相關的SQL注入風險

雖然SQL注入主要是後端問題,但前端開發者也需要了解並協助防範:

  • 1. API請求中的參數可能被用於構建SQL查詢
  • 2. 前端表單數據直接傳遞給後端時可能存在風險
  • 3. 客戶端存儲的數據(如localStorage)若用於查詢也可能被利用

防範SQL注入的方法

1. 使用參數化查詢/預處理語句

// 不安全的方式
const query = "SELECT * FROM users WHERE username = '" + username + "'";

// 安全的方式(參數化查詢)
const query = "SELECT * FROM users WHERE username = ?";
db.execute(query, [username]);

2. 前端輸入驗證

雖然前端驗證可被繞過,但仍是多層防禦的一部分

// React表單驗證示例
const validateInput = (input) => {
  // 移除SQL特殊字符
  if (/[;'"\-]/.test(input)) {
    setError('輸入包含不允許的字符');
    return false;
  }
  return true;
};

3. 使用ORM(對象關係映射)

ORM是將程式碼中的對象與數據庫表格建立映射關係的工具,讓開發者可以用操作對象的方式來操作數據庫,而不需要直接寫SQL語句

// 不使用ORM (直接寫SQL)
const query = "SELECT * FROM users WHERE id = " + userId;

// 使用ORM (例如Sequelize)
const user = await User.findByPk(userId);  // 自動防護SQL注入

ORM工具會自動處理參數化查詢,有效防止SQL注入攻擊,同時提高代碼可讀性和維護性

SQL注入常見面試題

1. 如何避免SQL注入,前端能做些什麼?

答:雖然SQL注入防護主要是後端責任,但前端也能提供額外保護層:

1. 輸入驗證與消毒

實施客戶端輸入驗證,過濾或轉義特殊字符(如單引號、分號等)

const sanitizeInput = (input) => {
  return input.replace(/[\';\-\"\/\*]/g, '');
};

2. 使用參數化API請求

使用結構化數據(如JSON)而非字符串拼接傳遞參數

// 推薦:使用結構化數據
fetch('/api/users', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ username, password })
});

3. 使用現代前端框架

React、Vue等框架自動轉義輸出,防止XSS攻擊,間接減少SQL注入風險

4. 實施適當的錯誤處理

避免向用戶顯示詳細的數據庫錯誤信息,這可能幫助攻擊者調整注入策略

記住:前端防護只是第一道防線,永遠不能替代後端的安全措施。SQL注入的根本防禦必須在後端實現,如使用參數化查詢、ORM和適當的權限控制。