2011-11-13 24 views
1

我在Zend Db的update()方法中遇到問題。這對於自己的sql注入是不安全的。爲什麼我不能使用mysql_real_escape_string和zend框架的update()方法?

選擇方法看起來很安全,所以我理論上可以做一個選擇,然後在修改要更新的字段後簡單地執行save()。但是,我不想運行2個查詢 - 一個選擇後跟一個更新,只是爲了運行更新。這似乎並不高效。

爲了解決這個問題,我嘗試使用mysql_real_escape_string(),但它實際上導致我試圖更新的數據作爲空字符串進入數據庫。不知道爲什麼。

下面是代碼:

public function updateMyTable($data,$id){ 
    $safeData=array(); 
    foreach($data as $field=>$val){ 
     $safeData[$field] = mysql_real_escape_string($val); 
    } 
    $where[]= 'id = '.mysql_real_escape_string($id); 
    self::instance()->update($safeData,$where) 
} 

有誰知道,如果我有什麼不正確,導致該空白數據庫條目?或者,一種安全使用update()的方法?我不想使用Zend的quote()方法,因爲它實際上將斜槓放入數據庫中的數據中。謝謝。

+0

爲什麼你認爲它是開放的SQL注入?我不是說這不是,我只是想知道你爲什麼這麼想。 –

+0

例如,如果您使用['Pdo_Mysql'](http://framework.zend.com/manual/en/zend.db.adapter.html),則不需要自行轉義字符串。 –

+0

好點。我回到參考手冊,它並沒有說它沒有逃脫,雖然它談論使用quote(),我錯誤地認爲它是用於逃避數據。也許有問題。我會嘗試一次注射,看看會發生什麼。謝謝!! –

回答

3

mysql_real_escape_string需要連接到由mysql_connect打開的數據庫才能工作,並且如果框架使用其他驅動程序,例如mysqli它將無法使用此功能轉義字符串。尋找文檔,應該有一個特殊的方法來轉義框架內的數據。

+0

啊,謝謝你解釋爲什麼它不起作用。我無法找到實際上並沒有在數據庫中添加斜槓的轉義方法。希望有人會知道一個併發布它。 –

+0

ZEND有沒有其他選擇(比如'mysql_real_escape_string')? – M98

3

當您更新Zend框架模型,你應該寫這樣的代碼:

$Values = array(
    'Col1' => $this->Attr1, 
    'Col2' => $this->Attr2 
); 

$RowChanged = $Db->update('table_name', $Values, $Db->quoteInto('Id = ?', $this->Id)); 
+0

[quoteInto()documentation](http://framework.zend.com/manual/en/zend.db.adapter.html#zend.db.adapter.quoting.quote-into)。 –

+0

我試過這個,但是它實際上在我的數據庫中的數據中加入了斜線,與mysql_real_escape_string()比起來更像addslashes()。 –

+0

@ user902545以這種方式使用更新方法是一種很好且安全的方法。它會防禦你從sql注入。此外,當你檢索數據時,你不會得到額外的斜線。 –

相關問題