SQL Injection 攻擊與防禦

閱讀時間約 3 分鐘
假如你開發了一個網站,有user登入的功能,駭客故意輸入SQL語法來破壞原本的SQL結構,這就是SQL注入攻擊。
以下直接用程式碼來了解:
想像L28, 29是user輸入的帳號密碼,在正常情況下可以成功查出這個user。
正常情況下SQL長這樣:
SELECT * FROM user where account = 'abc' and password = '123'
現在我把程式碼L29改成這樣:
結果還是一樣成功找出這個user了!
因為現在SQL變成這樣了:
SELECT * FROM user where account = 'abc' and password = 'xxx' or '1'='1'
雖然沒有密碼是xxx的,但是'1'='1'是成立的,因此這個table資料就被撈出來了!
一般登入驗證成功後,可能不會把帳密撈出來,但是駭客透過這種方式還是可以登入成功,雖然不知道你的密碼。

這個攻擊的示範還只是把資料抓出來而已,那如果是下delete呢?

防禦SQL Injection:

1. 將user輸入的SQL關鍵字select or ' " 等等字元過濾。
2. 資料庫中儲存加密後的密碼,後端接收到user輸入的密碼後,先進行密碼加密,再組select SQL來驗證是否資料比對成功。
3. 將資料庫不必要的權限拔除,例如把drop table權限拿掉、不需要delete的table就不要grant權限給該db user。
4. 程式使用Prepared statement bind params的方式來下SQL:
將程式碼改成這樣:
可以發現雖然L29被sql injection,但是卻沒撈出結果。
利用L38把最後執行的SQL print出來可以發現,最終執行的SQL是這樣:
SELECT * FROM user where account = 'abc' and password = 'xxx\' or \'1\'=\'1'
因為bindParam幫我們把單引號跳脫掉了,因此避開了SQL Injection攻擊。

5. 使用ORM
為什麼會看到廣告
20會員
161內容數
留言0
查看全部
發表第一個留言支持創作者!
Vic Lin的沙龍 的其他內容
Connection Pool (連線池)
閱讀時間約 2 分鐘
Cross-Site Scripting 攻擊
閱讀時間約 1 分鐘
防禦XSS攻擊
閱讀時間約 3 分鐘
CSRF攻擊與防禦
閱讀時間約 12 分鐘
你可能也想看
[SQL]如何安裝bcp公用程式bcp 公用程式安裝步驟
avatar
子皿子皿
2024-03-26
[SQL]錯誤解決方法: 將 varchar 值 '*' 轉換成資料類型 int 時,轉換失敗。本文介紹了在SQL Server中,遇到資料類型轉換失敗的解決方法。
avatar
子皿子皿
2024-03-04
SQL 深海探險錄 #11: 海神的命令SQL 深海探險錄 #11: 海神的命令
Thumbnail
avatar
KH Huang
2024-02-02
SQL_解決語法更新中文顯示問號(?)的方法在工作情境中手動執行SQL語法更新中文字時,有時會遇到中文字顯示問號(?)的情況。這篇文章將介紹如何解決手動執行SQL語法時造成中文顯示問號(?)的方法。
Thumbnail
avatar
DavidHi
2024-01-31
SQL 程式札記 : 連接(JOIN)本文將介紹 SQL 中的連接(JOIN),連接(JOIN)是用於結合來自兩個或多個資料表的相關數據,建議讀過我之前發佈的幾篇"SQL學習筆記"之後再來看這篇。
Thumbnail
avatar
梧笙
2024-01-16
工作記事本-可以不熟Oracle但是你總要會連它[MS SQL Linked Server]最近因為工作的關係,遇到了取用Oracle資料庫的問題,這邊有一篇實作後確實可用的文章,在此紀錄與增補一些遇到的問題
Thumbnail
avatar
Roy Lin
2022-08-02
1 個禮拜通過 ETL 工程師的 SQL 面試這是我面試當時面試 ETL 工程師的解方,基本上是以 SQL 為主要的攻略對象, 這裡會用 0 到 1 的方式去學習、複習、解題、面試小技巧等等的資源去分享。 不過還是來分享自己是如何準備 ETL 工程師這一個職缺的歷程, 接下來會給出「學習步驟」、「刷題小技巧」、「面試全攻略」。
Thumbnail
avatar
Dodson
2022-05-27
從零開始的SQL之旅 第一章 概論先說 !這是一個系列的學習手札,所有內容都是我邊學邊做的,有任何錯誤歡迎指教,希望大家能一起進步 本章能學到了 SQL 是什麼,它們的分類,以及Keys 的觀念
Thumbnail
avatar
Lockowl
2022-04-01
[SQL Server] A connection was successfully established with the server, but then an error occurred…今天寫程式連結資料庫,遇見這樣的錯誤 環境 .NET Core 6 / VS 2022 解決方法:DB連結字串 ConnectionString 需要額外加上 TrustServerCertificate=true。不然會出現錯誤 以 appsettings.json 設定檔為例
avatar
兩千MIS
2021-11-29