1. 程式人生 > >Web安全之SQL注入

Web安全之SQL注入

什麼是SQL注入?

sql注入是一種將sql程式碼新增到輸入引數中,傳遞到sql伺服器解析並執行的一種攻擊手法

SQL是怎麼產生的?

  • WEB開發人員無法保證所有的輸入都已經過濾
  • 攻擊者利用傳送給SQL伺服器的輸入資料構造可執行的SQL程式碼
  • 資料庫未做相應安全配置

如何尋找SQL注入漏洞?

  • 識別Web應用中所有的輸入點
輸入主要包含三部分內容:get請求,post請求,http的頭資訊(User-Agent、Referer以及IP和Cookie資訊)
  • 瞭解哪些型別的請求會觸發異常
如果是get請求可以在地址輸入欄新增特殊符號引起異常 若是post請求的話也差不多,可以在輸入的內容中新增特殊符號引起異常
  • 檢測伺服器響應中的異常
如何進行SQL注入攻擊?
  • 數字注入
比如位址列有這麼一條語句:..............?id=1 這是一條get請求方式的查詢語句 如果我想獲得所有資料就可以將引數改為:?id=-1 OR 1=1
  • 字串注入
比如有一個簡單的登入介面,輸入使用者名稱和密碼,點選登入。 通過字串注入能我讓不用輸入密碼,就能登入 使用者名稱欄中輸入 :       xiaoming'# 密碼欄不用輸入或隨便輸入就能登入 什麼原因呢? 假設使用者名稱是xiaoming,後又跟上單引號" ' "和"#",單引號的使用是為了閉合前面的語句,而使用#註釋了後面的密碼驗證的sql 所以僅僅通過使用者名稱就通過了sql驗證 例句:SELECT * FROM  user WHERE name='xiaoming'#' AND password='dfiwegfisdhfisdhfsdfsdf' #前面的單引號閉合了xiaoming前面的單引號 因為#的存在,這條sql就相當於  SELECT * FROM  user WHERE name='xiaoming' 除了用#註釋,還有 "-- "(兩條橫槓加一個空格)也可以註釋

如何預防SQL注入?

  • 嚴格檢查輸入變數的型別和格式
主要是通過在後臺利用正則表示式匹配的方式檢查輸入的格式型別
  • 過濾和轉義特殊字元
  • 利用Mysql預編譯機制
我們平常應該都用過Mysql預編譯機制,預編譯機制就是預先構建一個sql模板:SELECT * FROM user WHERE name=? AND pass=?,這樣採用"?佔位符"的形式構建的sql語句就是sql模板,預編譯機制會把sql模板發給mysql伺服器,mysql伺服器會對模板進行編譯,編譯之後進行優化分析,對相應的索引進行優化,你在繫結引數之後,引數會傳遞給mysql伺服器直接執行,節省了查詢時間和mysql伺服器的一些資源,達到一次編譯多次執行的目的。除了這個目的還有一個功能就是防止SQL注入:當你把繫結的引數傳遞給mysql伺服器,伺服器將引數填充到佔位符的過程中,實際上還做了轉義操作,這樣就防止了SQL注入