所謂sql注入,就是通過把sql命令插入到web表單提交或輸入網域名稱或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的sql命令。具體來說,它是利用現有應用程式,將(惡意的)sql命令注入到後台資料庫引擎執行的能力,它可以通過在web表單中輸入(惡意)sql語句得到乙個存在安全漏洞的**上的資料庫,而不是按照設計者意圖去執行sql語句。比如先前的很多影視**洩露vip會員密碼大多就是通過web表單遞交查詢字元暴出的,這類表單特別容易受到sql注入式攻擊。
場景:
比如現在資料庫中有乙個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語句實現以下需求:
實現乙個根據使用者id獲取使用者詳情的檢視。示例**如下:
)這樣表面上看起來沒有問題。但是如果使用者傳的user_id是等於1 or 1=1,那麼以上拼接後的sql語句為:
select id
,username from front_user where id=1
or1=1
以上sql語句的條件是id=1 or 1=1,只要id=1或者是1=1兩個有乙個成立,那麼整個條件就成立。毫無疑問1=1是肯定成立的。因此執行完以上sql語句後,會將front_user表中所有的資料都提取出來。
實現乙個根據使用者的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注入呢?歸類起來主要有以下幾點:
永遠不要信任使用者的輸入。對使用者的輸入進行校驗,可以通過正規表示式,或限制長度;對單引號和 雙"-"進行轉換等。
永遠不要使用動態拼裝sql,可以使用引數化的sql或者直接使用儲存過程進行資料查詢訪問。比如:
)永遠不要使用管理員許可權的資料庫連線,為每個應用使用單獨的許可權有限的資料庫連線。
不要把機密資訊直接存放,加密或者hash掉密碼和敏感的資訊。
應用的異常資訊應該給出盡可能少的提示,最好使用自定義的錯誤資訊對原始錯誤資訊進行包裝。
在django中如何防禦sql注入:
使用orm來做資料的增刪改查。因為orm使用的是引數化的形式執行sql語句的。
攻防世界 Web篇
1.題目描述 cookie x老師告訴小寧他在cookie裡放了些東西,小寧疑惑地想 這是夾心餅乾的意思嗎?2.題目場景 3.writeup解題思路 cookie通俗的講是型別為 小型文字檔案 是某些 為了辨別使用者身份,進行session跟蹤而儲存在使用者本地終端上的資料 通常經過加密 由使用者客...
讀《黑客攻防技術寶典 WEB實戰篇》
6.2.1 密碼保密性不強 弱密碼,web應用並未對使用者自定義的密碼進行約束。6.2.2 蠻力攻擊登入 暴力破解,應用程式允許攻擊者無阻力地不斷嘗試錯誤密碼,直到猜對,不採取阻攔。6.2.3 詳細的失敗訊息 類似於登入失敗後顯示的 使用者不存在 和 密碼錯誤 這樣會幫助攻擊者確定username和...
網路安全攻防之Web滲透測試知識點總結
1.簡述osi的七層結構 2.簡述tcp三次握手的過程 3.簡要說明tcp和udp區別以及用途 4.tcp的半連線狀態是什麼 5.ip的報頭是怎麼樣的 6.nat轉換的原理是什麼?和iptables的關係?7.dhcp協議的功能?報文結構?8.dhcp動態分配ip的過程是什麼?它的原理是什麼?9.講...