天天看點

sql注入攻擊_代碼示範:什麼是SQL注入攻擊?

sql注入攻擊_代碼示範:什麼是SQL注入攻擊?

往期置頂資源 可自取

  • 找工作履歷模闆集(word格式)下載下傳
  • Java基礎核心知識大總結.pdf 下載下傳
  • 68道C/C++常見面試題(含答案)下載下傳
  • Java後端開發學習路線+知識點總結
  • 前端開發學習路線+知識點總結
  • 大資料開發學習路線+知識點總結
  • C/C++開發(背景)學習路線+知識點總結
  • 嵌入式開發學習路線+知識點總結

SQL注入攻擊是黑客對資料庫進行攻擊的常用手段之一,随着B/S模式應用開發的發展,使用這種模式編寫應用程式的程式員也越來越多。但是由于程式員的水準及經驗參差不齊,相當大一部分程式員在編寫代碼的時候,沒有對使用者輸入資料的合法性進行判斷,使應用程式存在安全隐患。使用者可以送出一段資料庫查詢代碼,根據程式傳回的結果,獲得某些他想擷取的資料,這就是所謂的SQL Injection,即SQL注入。

一 背景

假如某高校開發了一個網課系統,要求學生選課後完成學習,資料庫中有一張表

course

,這張表存放着每個學生的選課資訊及完成情況,具體設計如下:

sql注入攻擊_代碼示範:什麼是SQL注入攻擊?

資料如下:

sql注入攻擊_代碼示範:什麼是SQL注入攻擊?

本系統采用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注入攻擊_代碼示範:什麼是SQL注入攻擊?

根據響應結果,我們很快便能寫出對應的sql,如下:

2. 如果我們想要擷取這張表的所有資料,隻需要保證上面這個sql的where條件恒真就可以了。

請求接口的時候将

studendId

 設定為4 or 1 = 1,這樣這條sql的where條件就恒真了。sql也就等同于下面這樣

請求結果如下,我們拿到了這張表的所有資料

sql注入攻擊_代碼示範:什麼是SQL注入攻擊?

3. 查詢mysql版本号,使用

union

拼接sql

sql注入攻擊_代碼示範:什麼是SQL注入攻擊?

4. 查詢資料庫名

sql注入攻擊_代碼示範:什麼是SQL注入攻擊?

5. 查詢mysql目前使用者的所有庫

sql注入攻擊_代碼示範:什麼是SQL注入攻擊?

看完上面這些示範後,你害怕了嗎?你所有的資料配置都完全暴露出來了,除此之外,還可以完成很多操作,更新資料、删庫、删表等等。

三 如何防止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++開發(背景)學習路線+知識點總結
  • 嵌入式開發學習路線+知識點總結

每天進步一點點 慢一點才能更快