所謂sql注入,就是通過把sql命令插入到web表單提交或輸入網域名稱或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的sql命令。具體來說,它是利用現有應用程式,將(惡意的)sql命令注入到後台資料庫引擎執行的能力,它可以通過在web表單中輸入(惡意)sql語句得到乙個存在安全漏洞的**上的資料庫,而不是按照設計者意圖去執行sql語句。
不只是常見的mysql,oracle資料庫,sqlite資料庫如果出現sql語句書寫不規範,也可能出現sql注入。以下是乙個登入功能的**:
/**
* 讀取userdata.db中的使用者資訊
* */
protected void readuserinfo() else
}/**
* 驗證登入資訊
* */
public boolean login(string username, string password)
return false;
}
我們可以看到這段**中,資料庫查詢語句是依靠字串拼接組成查詢語句,這樣很容易發生sql諸注入!
string sql = "select *from usertable where username='"+username+"'"+"and password='"+password+"'";
為什麼會產生sql注入呢?
我們根據這個簡單的註冊登入專案來解釋。
首先註冊乙個賬號,賬號密碼都為123。
這時我們來驗證一下登入功能。
我們輸入正確的賬號密碼 ,可以看到登入成功。
我們輸入錯誤的密碼,登入失敗,證明登入功能是正常的。
這時候,我們在賬號中輸入123』or』1=1 密碼輸入乙個錯誤的12,我們可以看到,他也是登入成功了。為什麼呢?
因為賬號輸入123』or』1=1,密碼輸入12此時sql查詢語句就變成
select *from usertable where username='123 ' or ' 1=1' and password = ' 12 ';
這條語句意味著,只要賬號密碼中,其中乙個輸入是正確的再加上or 1=1 (永真),此查詢語句就能夠查詢到資料庫中的值,騙過伺服器從而進入到登入成功的頁面,登入成功還是輕的,假設再加上一條語句drop table ***呢…後果不堪設想。
我們修改一下登入功能的**
string sql = "select *from usertable where username=? and password=?";
cursor cursor = db.rawquery(sql,new string);
這時候我們在嘗試用剛才sql注入的方法登入看看
發現此時sql注入已經失效。
此方法是通過使用佔位符?,代表我們要輸入的引數。rawquery函式中的第乙個引數是sql語句,第二個引數new string替換掉sql語句中的佔位符,因為此時123』or』1=1是乙個整體,代表username ,所以不會對查詢語句產生影響。
1.永遠不要信任使用者的輸入。對使用者的輸入進行校驗,可以通過正規表示式,或限制長度;對單引號 和雙"-"進行轉換等。
2.永遠不要使用動態拼裝sql,可以使用引數化的sql或者直接使用儲存過程進行資料查詢訪問。
3.永遠不要使用管理員許可權的資料庫連線,為每個應用使用單獨的許可權有限的資料庫連線。
4.不要把機密資訊直接存放,加密或者hash掉密碼和敏感的資訊。
5.應用的異常資訊應該給出盡可能少的提示,最好使用自定義的錯誤資訊對原始錯誤資訊進行包裝
6.sql注入的檢測方法一般採取輔助軟體或**平台來檢測,軟體一般採用sql注入檢測工具jsky,**平台就有億思**安全平台檢測工具。mdcsoft scan等。採用mdcsoft-ips可以有效的防禦sql注入,xss攻擊等。
Mysql匯入sql檔案可能出現的問題
mysql匯入sql檔案可能出現的問題 1 可能出現的錯誤 本地匯入sql檔案時,出現 mysql server has gone away 的錯誤 2 問題分析 mysql server has gone away 的問題意思就是指client和mysql server之間的鏈結斷開了。造成這樣的...
jupyter notebook可能出現的問題
首頁 專欄python 文章詳情 1 無道 發布於 2020 07 23 環境 anaconda,python3.7,jupyter notebook,win10 終端上配置有多個conda的python環境,在使用jupyter notebook時需要使用其中的乙個環境,但是其預設還是使用系統py...
遞迴可能出現的效能問題
遞迴演算法的 很簡潔。但同時也存在缺點。遞迴由於函式要呼叫自身,而函式呼叫是有時間和空間的消耗的。每一次函式呼叫,都需要在記憶體棧中分配空間以儲存引數 返回位址及臨時變數,而且往棧裡壓入資料和彈出資料都需要時間。遞迴有可能很多計算都是重複的,從而對效能帶來很大的負面影響。遞迴的本質是把乙個問題分解成...