Appearance
SQL injection
什麼是 SQL injection
SQL 注入(SQL Injection)是一種常見的網頁應用程式安全漏洞,它允許攻擊者將惡意的 SQL 程式碼插入到應用程式的資料庫查詢中,從而干擾資料庫的運作,獲取敏感資訊,甚至接管整個資料庫。
如何測試是否有 SQL injection 漏洞?
可以在任意有輸入匡的地方輸入 ' 或是 " 符號,粗淺的漏洞通常就會因此而出現 Error 出現。

成因與如何攻擊
SQL 注入通常發生在應用程式將使用者輸入直接拼接到 SQL 查詢字串中,而沒有進行適當的驗證和過濾。例如,一個有漏洞的登入頁面可能有如下的 SQL 查詢:
sql
String query = "SELECT * FROM users WHERE username='" + username + "' AND password='" + password + "'";如果攻擊者在使用者名欄位輸入 ' OR 1=1--,而密碼欄位隨意輸入,那麼最終的查詢語句會變成:
sql
SELECT * FROM users WHERE username='' OR 1=1--' AND password='隨意輸入'在 SQL 中,-- 表示註釋,所以 -- 後面的內容都會被資料庫忽略。因此,上述查詢實際上等同於:
sql
SELECT * FROM users WHERE username='' OR 1=1這個查詢會返回 users 表中的所有使用者,因為 1=1 永遠為真。攻擊者就可以繞過登入驗證,未經授權地訪問到所有使用者的資料。
除了繞過認證,SQL 注入還可以用於:
- 查詢敏感資訊,如其他使用者的個人資料、密碼等。
- 修改資料庫內容,如更改密碼、刪除資料等。
- 執行資料庫管理操作,如關閉資料庫、授予權限等。
- 在某些情況下,還可以讀寫伺服器上的檔案,執行任意的系統命令。
如何防止 SQL Injection
為了防止 SQL 注入,應用程式開發者需要:
- 對所有的使用者輸入進行驗證和過濾,特別是那些被用於構建 SQL 查詢的部分。
- 使用參數化查詢或準備語句,將使用者輸入與 SQL 查詢邏輯分離。
- 限制資料庫使用者的權限,只授予必要的最小權限。
- 定期進行安全測試和程式碼審查,及時發現和修復 SQL 注入漏洞。
SQL 注入是一種古老但仍然普遍存在的安全問題,它曾導致許多高調的資料洩露事件。開發者需要提高安全意識,在開發過程中始終考慮 SQL 注入的風險,並遵循安全的編碼實踐,才能有效地保護應用程式和使用者的資料安全。