sql注入一點當心得

  很久沒寫技術博客,最近研究產品關於用戶體驗方面較多,加上項目忽然比較多,設計原型、跟進開發、設計師等工做着實沒時間寫博客。
  接下來技術上主要php深刻學習和mysql優化。這兩天看了關於sql注入方面的知識,拿出來分享一下 :)
  
登陸注入
 

  
  先看一個咱們通常用的登陸頁面sql語句(原生態php執行的sql)
$sql = "select * from users where username = '$username' and password = '$password'";

  對於這種sql,對應一個萬能密碼和用戶名:php

    萬能密碼: xx' or 1='1
    萬能用戶名: xx' union select * from users/*
    執行時mysql解釋爲:
$sql = select * from users where username = '$username' and password = ' xx' or 1='1'

  不解釋,瞬間破解mysql

  一樣,上面是在sql語句中查詢字段後的輸入值加了單引號,有些時候尤爲是初級程序員常常對變量不加單引號:程序員

 

$sql = "select * from users where username = $username and password = $password";    

 

  這時mysql解釋會被當作數字型字段來匹配sql

     萬能密碼: 11 union select * from users/*
    執行語句:
select * from users where username = 11 union select * from users/* and password = 54
 
查詢注入
 

  
  這個比較好理解,通常在頁面的搜索框點擊按鈕搜索時在後臺sql中可能會用like來查詢,但若是沒有加任何處理,可能輸入一個% 或 __ 就會注入到sql中查詢所有或部分記錄,不過在php中可使用一個函數來處理一下:
$keyword = addslashes($keyword);
$keword = str_replace("%","\$",$kwyword);

插入注入
 

  
  咱們先模擬一個網站註冊頁面的sql處理語句:
insert into users(username,password,grade) values('frank','123456','1');
  假如users表中grade爲等級字段,而且默認字段爲1,註冊時用戶輸入用戶名和密碼兩個字段後,後臺插入語句爲上面語句,則當用戶輸入的密碼爲 123456','3')/*時,執行sql爲:
insert into users(username,password,grade) values('frank','123456','3')/*,'1';
  這樣也能夠達到注入的目的
 
 
解決sql注入: 
 

     
  ①. 在服務器設置將php.ini配置文件中magic_quotes_gpc設置爲On
          服務器會自動將單引號轉義爲:\'
          不過攻擊時能夠將單引號寫爲char(13)-單引號ASCII碼,也同樣能夠攻擊
 
     ②. 密碼比對
          經過輸入的用戶名獲取密碼,再對密碼進行匹配
          $sql  = "select * from users where username ='frank'"
          $result = mysql_query($sql,$conn);
          $row = mysql_fetch_array($result);
          if($row['password'] != $password) ...
 
      ③. 使用pdo的PDO::prepare()預處理操做
          PDO(PHP Data Object)擴展在PHP5中加入,PHP6默認識別PDO鏈接數據庫,pdo至關因而一個數據庫抽象層,不一樣數據庫使用相同的方法名,解決數據庫鏈接不一樣意問題。
          工做原理以下:
               
          (使用時需先在php.ini中開啓對pdo擴展的支持)
      $sql = "select * from users where username=? and password=?";
          //建立一個pdo對象
          $mypdo = new PDO("mysql:host=localhost;port=3306;dbname=xx","root","123456");
          //設置編碼
          $mypdo->exec("set names utf8");
 
          //預處理$sql
          $pdostatement = $mypdo->prepare(%sql);
          //將用戶名和密碼填入sql
          $pdostatement->execute(array($username,$password));
 
          //獲得查詢結果
          $result = $pdostatement->fetch();
 
          if(empty($result)) ...

 

     ④. 其餘企業級解決sql注入方式:IDS(入侵檢測系統)
 
          
 
  關於sql注入對於開發工程師來講主要是防守,提升編寫安全代碼的意識,讓咱們編寫的代碼質量更高,安全性方面更好。
相關文章
相關標籤/搜索