Django之SQL注入

2022-07-31 12:00:22 字數 2721 閱讀 7475

## 所謂sql注入,就是通過把sql命令插入到表單中或頁面請求的查詢字串中,最終達到欺騙伺服器執行惡意的sql命令。

具體來說,它是利用現有應用程式,將(惡意的)sql命令注入到後台資料庫引擎執行的能力,

它可以通過在web表單中輸入(惡意)sql語句得到乙個存在安全漏洞的**上的資料庫,而不是按照設計者意圖去執行sql語句。

比如先前的很多影視**洩露vip會員密碼大多就是通過web表單遞交查詢字元暴出的。

## 場景:

比如現在資料庫中有乙個front_user表,表結構如下:

class

user(models.model):

telephone = models.charfield(max_length=11)

username = models.charfield(max_length=100)

password = models.charfield(max_length=100)

然後我們使用原生sql語句實現以下需求:

1.實現乙個根據使用者id獲取使用者詳情的檢視。示例**如下:

這樣表面上看起來沒有問題。但是如果使用者傳的user_id是等於1

or 1=1,那麼以上拼接後的sql語句為:

select id,username

from front_user where id=1 or 1=1以上sql語句的條件是id=1 or 1=1,只要id=1或者是1=1兩個有乙個成立,那麼整個條件就成立。毫無疑問1=1是肯定成立的。

因此執行完以上sql語句後,會將front_user表中所有的資料都提取出來。

2.實現乙個根據使用者的username提取使用者的檢視。示例**如下:

這樣表面上看起來也沒有問題。但是如果使用者傳的username是zhiliao

'or

'1=1,那麼以上拼接後的sql語句為:

select id,username

from front_user where username='

zhiliao'or

'1=1

'以上sql語句的條件是username='

zhiliao

'或者是乙個字串,毫無疑問,字串的判斷是肯定成立的。因此會將front_user表中所有的資料都提取出來。

################# sql注入防禦:

以上便是sql注入的原理。他通過傳遞一些惡意的引數來破壞原有的sql語句以便達到自己的目的。

當然sql注入遠遠沒有這麼簡單,我們現在講到的只是冰山一角。那麼如何防禦sql注入呢?歸類起來主要有以下幾點:

1.永遠不要信任使用者的輸入。對使用者的輸入進行校驗,可以通過正規表示式,或限制長度;對單引號和 雙"-"

進行轉換等。

2.永遠不要使用動態拼裝sql,可以使用引數化的sql或者直接使用儲存過程進行資料查詢訪問。比如:

3.永遠不要使用管理員許可權的資料庫連線,為每個應用使用單獨的許可權有限的資料庫連線。

4.不要把機密資訊直接存放,加密或者hash掉密碼和敏感的資訊。

5.應用的異常資訊應該給出盡可能少的提示,最好使用自定義的錯誤資訊對原始錯誤資訊進行包裝。

## 在django中如何防禦sql注入:

1.使用orm來做資料的增刪改查。因為orm使用的是引數化的形式執行sql語句的。

2.如果萬一要執行原生sql語句,那麼建議不要拼接sql,而是使用引數化的形式。

Django中的sql注入

django中防止sql注入的方法 總是使用django自帶的資料庫api。它會根據你所使用的資料庫伺服器 例如postsql或者mysql 的轉換規則,自動轉義特殊的sql引數。這被運用到了整個django的資料庫api中,只有一些例外 傳給 extra 方法的 where 引數。這個引數故意設計...

注入攻擊之sql注入

在1998年,一位名為rfp的黑客發表了一篇題為 nt web technology vulnerabilities 的文章 注入攻擊的兩個條件 1 使用者能夠克制資料的輸入 在這裡,使用者能夠控制變數 2 原本要執行的 憑藉了使用者的輸入 一般輸入乙個 單引號就能引起執行查詢語句的語法錯誤,有些伺...

SQL注入之報錯注入

固定語句公式 union select 1 from select count concat floor rand 0 2 注入爆資料語句 a from information schema.tables group by a b 假如id輸入存在注入的話,可以通過如下語句進行報錯。mysql se...