zencart 防止SQL注入的處理

總的來說,zencart 這個系統關於安全性的問題做得是比較好的。這些安全性的方面比較多,現在就特別介紹這個防sql注入 。那什麼叫SQL注入呢?我摘一段來自百度百科的介紹。 
所謂SQL注入,就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令--百度百科 
所以一般發生sql注入的問題都是通過表單提交數據,而這個提交的數據又沒有做特殊判斷處理的話,就很容易發生SQL注入漏洞了。zencart發展到現在,這個問題自然是不會存在的,除非經過第三方二次開發,而又沒有很好的做好這方面的處理,纔有可能發生。下面就簡單的介紹zencart是怎麼對這個做的處理。 
在zencart裏面有可能發生這個問題的就是在用戶登錄和註冊的時候提交的表單數據,這裏就以登錄頁面做介紹。 
首先獲取用戶提交的email和密碼。 
$email_address = zen_db_prepare_input($_POST['email_address']); 
$password = zen_db_prepare_input($_POST['password']); 
這裏不是直接獲取$_POST數據,而是經過了zen_db_prepare_input這個函數處理,這個函數是zencart專門用來處理表單提交的數據,所以二次開發的時候涉及到表單提交的數據,最好按照這個方式來做第一步處理。 
這個zen_db_prepare_input函數 的定義如下, 
  function zen_db_prepare_input($string) { 
    if (is_string($string)) { 
      return trim(zen_sanitize_string(stripslashes($string))); 
    } elseif (is_array($string)) { 
      reset($string); 
      while (list($key, $value) = each($string)) { 
        $string[$key] = zen_db_prepare_input($value); 
      } 
     return $string; 
    } else { 
      return $string; 
    } 
  } 
  function zen_sanitize_string($string) { 
    $string = preg_replace('/ +/', ' ', $string); 
    return preg_replace("/[<>]/", '_', $string); 
  } 
看這個函數的定義就知道這個處理是把html標籤替換。做了這一步簡單的處理還不可以,接下來還有做第二步處理 
第二步就是校驗用戶是否存在 
    $check_customer_query = "SELECT customers_id, customers_firstname, customers_lastname, customers_password, 
                                    customers_email_address, customers_default_address_id, 
                                    customers_authorization, customers_referral 
                           FROM " . TABLE_CUSTOMERS . " 
                           WHERE customers_email_address = :emailAddress"; 
這個SQL語句並沒有直接做密碼 的對比,如果簡單的做帳號和密碼的對比就很容易發生sql注入的危險了。而zencart顯然沒有這樣做,它使用了一個佔位符:emailAddress,這個也是很多人覺得奇怪的問題,爲什麼要這樣做呢?還是爲了防止sql注入的漏洞。zencart做了如下的處理 
$check_customer_query  =$db->bindVars($check_customer_query, ':emailAddress', $email_address, 'string'); 
這個數據庫的函數就是對輸入的數據做類型的檢測和SQL語句安全性的檢測,它有兩個主要的步驟要處理,首先檢查提交的數據的類型是否跟這個函數指定的類型一樣,如果不一樣,程序就停止運行。其次要檢測的就是獲取的字符串是否是安全的SQL語言,如果類型檢查通過了就調用$this->prepare_input($value);這個函數 ,對SQL語言安全性檢查,這個函數 的定義: 
  function prepare_input($zp_string) { 
    if (function_exists('mysql_real_escape_string')) { 
      return mysql_real_escape_string($zp_string, $this->link); 
    } elseif (function_exists('mysql_escape_string')) { 
      return mysql_escape_string($zp_string, $this->link); 
    } else { 
      return addslashes($zp_string); 
    } 
  } 
這個函數裏面調用的mysql的函數纔是最關鍵的,這裏就是把有害的SQL字符去掉,比如把'單引號註釋\',這樣對SQL語句就沒有影響了。 
所以如果是做zencart二次開發涉及到表單提交數據的時候,必須要按照這兩步來處理才能保證數據的安全,這樣就可以防止第三方開發引入的系統漏洞了。 
 轉載 http://www.zencart-bbs.com/read-htm-tid-4211.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章