--- title: SQL Injection tags: 學習筆記 --- # SQL Injection ## 什麼是 SQL Injection? SQL Injection 是發生於應用程式與資料庫層的**安全漏洞**。簡而言之,是在輸入的字串之中夾帶SQL指令,在設計不良的程式當中忽略了字元檢查,那麼這些夾帶進去的惡意指令就會被資料庫伺服器誤認為是正常的SQL指令而執行,因此遭到破壞或是入侵。 --- ## 常見攻擊手法 假設登入驗證的語法這樣寫 `SELECT * FROM customers WHERE name = 'username ' AND password = 'password'` 當使用者在 username 中輸入 `'OR 1=1 --` 語法會變成 `SELECT * FROM customers WHERE name = '' OR 1=1 --AND password = 'password'` 而 -- 在 SQL 語法中代表將後面的內容都註解,所以實際上語法會是 `SELECT * FROM customers WHERE name =''OR 1=1` 又因為 1=1 恆成立,所以使用者不用任何帳號密碼就可以成功登入,很神奇吧! --- ## 如何避免 SQL Injection 在我們 PHP 工作坊中有使用到 PDO 就是一個能避免 SQL Injection 的方法,那也還有一些其他的方法如下: 1. 嚴格**限制**Web應用的資料庫的**操作權限**,給此用戶提供僅僅能夠滿足其工作的最低權限,從而最大限度的減少注入攻擊對資料庫的危害。 2. 檢查輸入的資料是否具有所期望的資料格式,嚴格**限制**變量的類型。 3. 對進入資料庫的特殊字符('”\&*;等)進行**轉義**處理,或**編碼轉換**。 4. 所有的查詢語句建議使用資料庫提供的參數化查詢接口,參數化的語句使用參數而不是將用戶輸入變量嵌入到 SQL 語句中,即不要直接**拼接** SQL 語句。 5. 在應用發布之前建議使用專業的 SQL 注入檢測工具進行檢測,以及時修補被發現的 SQL 注入漏洞。網上也有很多這方面的開源工具。 6. 避免網站打印出 SQL 錯誤資訊,比如類型錯誤、字段不匹配等,把代碼裡的 SQL 語句暴露出來,以防止攻擊者利用這些錯誤資訊進行 SQL 注入。 --- # 參考資料 [SQL注入 - 維基百科,自由的百科全書](https://zh.wikipedia.org/wiki/SQL%E6%B3%A8%E5%85%A5) [[Postx1] 攻擊行為-SQL 資料隱碼攻擊 SQL injection](https://ithelp.ithome.com.tw/articles/10189201) [避免 SQL INJECTION](http://blog.twbryce.com/%E9%81%BF%E5%85%8D-sql-injection/)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up