CI 防止sql注入和xss攻擊

 

CI(codeigniter)如何防止sql注入

 發表時間: 2012-11-30 06:52:12  By:雪潔  瀏覽次數:6009

通常狀況下咱們只要使用AR和開啓xss就能夠防止了。實現方法:php

1.開啓xssmysql

1 $config['global_xss_filtering']= TRUE;

2.使用ARweb

也許你會問AR是什麼?參考ci手冊,請看下圖:sql

相信你應該明白了。數據庫

那麼有的朋友會說爲何我都用了仍是有注入呢?那麼你就要分析其餘方面的漏洞了。安全

因 爲若是你所有使用了AR,那麼你傳進去的都是些「表名,條件」之類的參數,若是是sql注入的話這些參數傳進去會是失效的,比 如:$this->db->get('table');若是把table換成"select * from admin"它會執行成功嗎?以上只是我的想法,不正確的還請指正。xss

 

 

 

 

如下一些建議可供參考。函數

1.不管如何在獲取參數之時都建設將 xss過濾打開,好比codeigniter

  1. $this->input->get('username',true);

其中的true就表明打開了 xsspost

2.不要直接使用$_GET等相似方式得到數據,若是這樣獲取數據的話將不會被xss過濾

3.CI的數據在入庫以前不只不會增長轉義字符,並且還會取消它
好比 Input.php 裏面的這麼一段

  1. // We strip slashes if magic quotes is on to keep things consistent  
  2. if(get_magic_quotes_gpc())  
  3. {  
  4. $str = stripslashes($str);  
  5. }


4.若是你使用 $this->db->query('YOUR QUERY HERE'); 直接查詢數據庫,那麼你須要使用 $this->db->escape('fileld_name') 語句進行轉義,這樣才安全。
escape函數其實是調用的escape_str這個函數,只不過escape增長了一層對數據類型的判斷,看到了沒(注意:它可沒判斷數值類型的喲,因此說若是傳入的數據是數值型的話,你得本身動手判斷一下了),下面這兩個東東就是進行轉義的傢伙了。

  1. function escape($str)  
  2. {  
  3. if(is_string($str))  
  4. {  
  5. $str ="'".$this->escape_str($str)."'";  
  6. }  
  7. elseif (is_bool($str))  
  8. {  
  9. $str =($str === FALSE)?0:1;  
  10. }  
  11. elseif (is_null($str))  
  12. {  
  13. $str ='NULL';  
  14. }  
  15.  
  16. return $str;  
  17. }  
  18.  
  19. function escape_str($str, $like = FALSE)    
  20. {    
  21. if(is_array($str))  
  22. {  
  23. foreach($str as $key => $val)  
  24. {  
  25. $str[$key]= $this->escape_str($val, $like);  
  26. }  
  27.  
  28. return $str;  
  29. }  
  30.  
  31. if(function_exists('mysql_real_escape_string') AND is_resource($this->conn_id))  
  32. {  
  33. $str = mysql_real_escape_string($str, $this->conn_id);  
  34. }  
  35. elseif (function_exists('mysql_escape_string'))  
  36. {  
  37. $str = mysql_escape_string($str);  
  38. }  
  39. else  
  40. {  
  41. $str = addslashes($str);  
  42. }  
  43.  
  44. // escape LIKE condition wildcards  
  45. if($like === TRUE)  
  46. {  
  47. $str = str_replace(array('%','_'), array('\\%','\\_'), $str);  
  48. }  
  49.  
  50. return $str;  
  51. }


5.不管如何你都必需要對數值型數據手動判斷,這個得你本身作,好比用個 (int)之類的強制轉換。

  1. 對於使用 Active Record 操做的數據你能夠偷懶不用 $this->db->escape('fileld_name') 轉義了(事實上你若是你使用了反而會被多增長些引號之類的東西),由於它會幫你搞定,但數值型你仍是要本身判斷。

  2. 若是你使用 Active Record 操做的數據,那麼其實CI是在數據快要入數據庫的時候進行轉義的,因此在前面的不少地方你都看不到addslashes之類函數的身影,這樣作也是有好處的你看看escape_str函數裏對轉義函數的判斷就知道了。

8.上面我一再強調數值型數據必須得本身搞定,實際上若是你的SQL語句中對數值型加了單引號的話,應該問題不大,不過仍是建議處理一下。

相關文章
相關標籤/搜索