往期置頂資源 可自取
- 找工作履歷模闆集(word格式)下載下傳
- Java基礎核心知識大總結.pdf 下載下傳
- 68道C/C++常見面試題(含答案)下載下傳
- Java後端開發學習路線+知識點總結
- 前端開發學習路線+知識點總結
- 大資料開發學習路線+知識點總結
- C/C++開發(背景)學習路線+知識點總結
- 嵌入式開發學習路線+知識點總結
SQL注入攻擊是黑客對資料庫進行攻擊的常用手段之一,随着B/S模式應用開發的發展,使用這種模式編寫應用程式的程式員也越來越多。但是由于程式員的水準及經驗參差不齊,相當大一部分程式員在編寫代碼的時候,沒有對使用者輸入資料的合法性進行判斷,使應用程式存在安全隐患。使用者可以送出一段資料庫查詢代碼,根據程式傳回的結果,獲得某些他想擷取的資料,這就是所謂的SQL Injection,即SQL注入。
一 背景
假如某高校開發了一個網課系統,要求學生選課後完成學習,資料庫中有一張表
course
,這張表存放着每個學生的選課資訊及完成情況,具體設計如下:
資料如下:
本系統采用mysql做為資料庫,使用Jdbc來進行資料庫的相關操作。系統提供了一個功能查詢該學生的課程完成情況,代碼如下。
@RestController
public class Controller {
@Autowired
SqlInject sqlInject;
@GetMapping("list")
public List courseList(@RequestParam("studentId") String studentId){
List orders = sqlInject.orderList(studentId);return orders;
}
}
二 注入攻擊示範
1. 正常情況下查詢一個學生所選課程及完成情況隻需要傳入
student_id
,便可以查到相關資料。
根據響應結果,我們很快便能寫出對應的sql,如下:
2. 如果我們想要擷取這張表的所有資料,隻需要保證上面這個sql的where條件恒真就可以了。
請求接口的時候将
studendId
設定為4 or 1 = 1,這樣這條sql的where條件就恒真了。sql也就等同于下面這樣
請求結果如下,我們拿到了這張表的所有資料
3. 查詢mysql版本号,使用
union
拼接sql
4. 查詢資料庫名
5. 查詢mysql目前使用者的所有庫
看完上面這些示範後,你害怕了嗎?你所有的資料配置都完全暴露出來了,除此之外,還可以完成很多操作,更新資料、删庫、删表等等。
三 如何防止sql注入
1. 代碼層防止sql注入攻擊的最佳方案就是sql預編譯
這樣我們傳進來的參數
4 or 1 = 1
就會被當作是一個
student_id
,是以就不會出現sql注入了。
2. 确認每種資料的類型,比如是數字,資料庫則必須使用int類型來存儲
3. 規定資料長度,能在一定程度上防止sql注入
4. 嚴格限制資料庫權限,能最大程度減少sql注入的危害
5. 避免直接響應一些sql異常資訊,sql發生異常後,自定義異常進行響應
6. 過濾參數中含有的一些資料庫關鍵詞
< END >
往期資源整理 可自取
- 找工作履歷模闆大分享.doc下載下傳
- Java基礎核心知識大總結.pdf 下載下傳
- 68道C/C++常見面試題(含答案)下載下傳
- Java後端開發學習路線+知識點總結
- 前端開發學習路線+知識點總結
- 大資料開發學習路線+知識點總結
- C/C++開發(背景)學習路線+知識點總結
- 嵌入式開發學習路線+知識點總結
每天進步一點點 慢一點才能更快