mysql綁定參數bind_param原理以及防SQL注入

來源:互聯網
上載者:User

標籤:table   防sql注入   targe   glob   where   預設   產生   地方   無法   

假設我們的使用者表中存在一行.使用者名稱欄位為username.值為aaa.密碼欄位為pwd.值為pwd..

 

下面我們來類比一個使用者登入的過程..

<?php    $username = "aaa";    $pwd = "pwd";    $sql = "SELECT * FROM table WHERE username = ‘{$username}‘ AND pwd = ‘{$pwd}‘";    echo $sql; //輸出  SELECT * FROM table WHERE username = ‘aaa‘ AND pwd = ‘pwd‘    ?>  

 

這樣去執行這個sql語句.顯然是可以查詢出來東西的.返回使用者的這一列.登入成功!!
然後我改一下..把密碼改一下.隨便一個值.如下.我改成了ppp.

<?php    $pwd = ‘ppp‘;    $sql = "SELECT * FROM table WHERE username = ‘{$username}‘ AND pwd = ‘{$pwd}‘";    echo $sql; //輸出  SELECT * FROM table WHERE username = ‘aaa‘ AND pwd = ‘ppp‘    ?>   

  

 

這樣很顯然.如果去執行這個SQL語句..是查詢不到東西的.也就是密碼錯誤.登入失敗!!
但是有的人總是不老實的.他們會想盡一切辦法來進行非法的登入.所謂非法就是在他不知道使用者名稱密碼的時候進行登入.並且登入成功..
那麼他們所做的原理是什麼呢??其實原理都是利用SQL語句..SQL語句強大的同時也給我們帶來了不少麻煩..
我來舉個最簡單的例子.我們要運用到的SQL關鍵字是or
還是上面的代碼.我們只要修改一下密碼即可

<?php $username = "aaa"; $pwd = "fdsafda‘ or ‘1‘=‘1"; //前面的密碼是瞎填的..後來用or關鍵字..意思就是無所謂密碼什麼都執行 $sql = "SELECT * FROM table WHERE username = ‘{$username}‘ AND pwd = ‘{$pwd}‘"; echo $sql; //輸出 SELECT * FROM table WHERE username = ‘aaa‘ AND pwd = ‘fdsafda‘ or ‘1‘=‘1‘ ?>

  

執行一下這個SQL語句..可怕的事情發生了..竟然可以查詢到這一行資料..也就是登入成功了..
這是多麼可怕的事情..

 

SQL注入示範教程,見博文:http://blog.csdn.net/wusuopubupt/article/details/8818996


PHP為瞭解決這個問題.magic_quotes state..就是PHP會自動過濾傳過來的GET.POST等等.
題外話.實踐證明這個東西是畸形的..大部分程式不得不為判斷此功能而耗費了很多代碼..
在Java中可沒有這個東西..那麼Java中如何防止這種SQL注入呢??

Java的sql包中提供了一個名字叫PreparedStatement的類.
這個類就是我要說的綁定參數!
什麼叫綁定參數??我繼續給大家舉例..(我用PHP舉例)

<?php $username = "aaa"; $pwd = "pwd"; $sql = "SELECT * FROM table WHERE username = ? AND pwd = ?"; bindParam($sql, 1, $username, ‘STRING‘); //以字串的形式.在第一個問號的地方綁定$username這個變數 bindParam($sql, 2, $pwd, ‘STRING‘); //以字串的形式.在第二個問號的地方綁定$pwd這個變數 echo $sql; ?>

  

當然.到此.你肯定不知道會輸出什麼..更無法知道綁定參數有什麼好處!這樣做的優勢是什麼.更不知道bindParam這個函數到底做了什麼.
下面我簡單的寫一下這個函數:

<?php  /**   * 類比簡單的綁定參數過程   *   * @param string $sql    SQL語句   * @param int $location  問號位置   * @param mixed $var     替換的變數   * @param string $type   替換的類型   */ $times = 0;  //這裡要注意,因為要“真正的"改變$sql的值,所以用引用傳值function bindParam(&$sql, $location, $var, $type) {      global $times;      //確定類型      switch ($type) {          //字串          default:                    //預設使用字串類型          case ‘STRING‘ :              $var = addslashes($var);  //轉義              $var = "‘".$var."‘";      //加上單引號.SQL語句中字串插入必須加單引號              break;          case ‘INTEGER‘ :          case ‘INT‘ :              $var = (int)$var;         //強制轉換成int          //還可以增加更多類型..      }      //尋找問號的位置      for ($i=1, $pos = 0; $i<= $location; $i++) {          $pos = strpos($sql, ‘?‘, $pos+1);      }      //替換問號      $sql = substr($sql, 0, $pos) . $var . substr($sql, $pos + 1); }  ?> 

 

注:由於得知道去除問號的次數..所以我用了一個global來解決.如果放到類中就非常容易了.弄個私人屬性既可

通過上面的這個函數.我們知道了..綁定參數的防注入方式其實也是通過轉義進行的..只不過是對於變數而言的..
我們來做一個實驗:

<?php $times = 0; $username = "aaaa"; $pwd = "123"; $sql = "SELECT * FROM table WHERE username = ? AND pwd = ?"; bindParam($sql, 1, $username, ‘STRING‘); //以字串的形式.在第一個問號的地方綁定$username這個變數 bindParam($sql, 2, $pwd, ‘INT‘); //以字串的形式.在第二個問號的地方綁定$pwd這個變數 echo $sql; //輸出 SELECT * FROM table WHERE username = ‘aaaa‘ AND pwd = 123 ?>

  

可以看到.產生了非常正規的SQL語句.那麼好.我們現在來試下剛才被注入的那種情況

<?php  $times = 0;  $username = "aaa";  $pwd = "fdsafda‘ or ‘1‘=‘1";  $sql = "SELECT * FROM table WHERE username = ? AND pwd = ?";  bindParam($sql, 1, $username, ‘STRING‘);  //以字串的形式.在第一個問號的地方綁定$username這個變數  bindParam($sql, 2, $pwd, ‘STRING‘);       //以字串的形式.在第二個問號的地方綁定$pwd這個變數  echo $sql; //輸出  SELECT * FROM table WHERE username = ‘aaa‘ AND pwd = ‘fdsafda\‘ or \‘1\‘=\‘1‘  ?> 

可以看到.pd內部的注入已經被轉義.當成一個完整的字串了..這樣的話.就不可能被注入了.

 

轉於http://blog.csdn.net/wusuopubupt/article/details/9668501

 

mysql綁定參數bind_param原理以及防SQL注入

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.