2012-11-18 101 views
0

可能重複:
Do I need to escape data to protect against SQL injection when using bind_param() on MySQLi?php mysqli應該使用real_escape_string嗎?

我有一個簡化做一個查詢的類。這裏是一個代碼示例如何插入數據:

$dbi->prepare("INSERT INTO `temp` (`name`,`content`) VALUES (?,?);")->execute($name,$content); 

有在課堂上這樣的函數:

public function execute(){ 
     if(is_object($this->connection) && is_object($this->stmt)){ 
      if(count($args = func_get_args()) > 0){ 
       $types = array(); 
       $params = array(); 

       foreach($args as $arg){ 
        $types[] = is_int($arg) ? 'i' : (is_float($arg) ? 'd' : 's'); 
        $params[] = $arg; 
               /* 
               or maybe $params[] = $this->connection->real_escape_string($arg); 
               */ 
       } 

       array_unshift($params, implode($types)); 

       call_user_func_array(
        array($this->stmt, 'bind_param'), 
        $this->_pass_by_reference($params) 
       ); 
      } 

      if($this->stmt->execute()){ 
       $this->affected_rows = $this->stmt->affected_rows; 
       return $this; 
      } 
      else { 
       throw new Exception; 
      } 
     } 
     else { 
      throw new Exception; 
     } 
    } 

當我宣佈$params[]我有這樣$params[] = $arg;我應該把$params[] = $this->connection->real_escape_string($arg);與否?

謝謝。

+2

不,你不應該。綁定參數分別傳輸到數據庫,因此不需要轉義SQL查詢上下文。 – mario

回答

2

根據PHP Manual on mysqli和準備的語句:

逃逸和SQL注入

綁定變量會由服務器自動進行轉義。 服務器在執行前將其轉義值插入 語句模板的相應位置。必須向 服務器提供關於綁定變量類型的提示,以創建適當的 轉換。有關更多 信息,請參閱mysqli_stmt_bind_param()函數。

服務器中的值自動轉義有時被認爲是防止SQL注入的安全功能。如果 輸入值正確轉義,則可以使用未準備好的語句實現相同的安全級別 。

所以不,你不必關心轉義,服務器會照顧你逃跑。

手動轉義將導致雙重轉義值。並且我個人認爲佔位符?在sql語句中的最大優點是你不必關心轉義。

3

編號當您使用參數時,您不需要轉義字符串。

事實上,你一定不能轉義字符串,因爲你最終會在包含字面反斜槓的數據庫中存儲字符串。這不是你想要的。

相關問題