簡體   English   中英

避免使用Zend_Db類進行MySQL注入

[英]avoiding MySQL injections with the Zend_Db class

我目前使用Zend_Db來管理我的查詢。 我已經編寫了代碼,可以執行如下所示的查詢:

$handle->select()->from('user_id')
                   ->where('first_name=?', $id)
                   ->where('last_name=?', $lname)

假設Zend_Db會這樣做,我沒有清理輸入就完成了這個。 Zend會這樣做嗎?

另一個問題:Zend_Db是否清理insert('table', $data)update查詢?

謝謝。

我在Zend Framework中編寫了很多用於數據庫參數和引用的代碼,而我是該項目的團隊負責人(最高版本1.0)。

我試圖在可能的情況下鼓勵最佳實踐,但我必須在易用性方面取得平衡。

請注意,您始終可以檢查Zend_Db_Select對象的字符串值,以查看它是如何決定進行引用的。

print $select; // invokes __toString() method

您還可以使用Zend_Db_Profiler檢查Zend_Db代表您運行的SQL。

$db->getProfiler()->setEnabled(true);
$db->update( ... );
print $db->getProfiler()->getLastQueryProfile()->getQuery(); 
print_r $db->getProfiler()->getLastQueryProfile()->getQueryParams(); 
$db->getProfiler()->setEnabled(false);

以下是您具體問題的一些答案:

  • Zend_Db_Select::where('last_name=?', $lname)

    適當引用值。 雖然“ ? ”看起來像參數占位符,但在此方法中,參數實際上是適當引用並進行插值的。 所以它不是一個真正的查詢參數。 實際上,以下兩個語句產生與上述用法完全相同的查詢:

     $select->where( $db->quoteInto('last_name=?', $lname) ); $select->where( 'last_name=' . $db->quote($lname) ); 

    但是,如果傳遞的參數是Zend_Db_Expr類型的對象,則不會引用它。 您負責SQL注入風險,因為它是逐字插入的,以支持表達式值:

     $select->where('last_modified < ?', new Zend_Db_Expr('NOW()')) 

    該表達式中需要引用或分隔的任何其他部分是您的責任。 例如,如果將任何PHP變量插入到表達式中,則安全是您的責任。 如果列名是SQL關鍵字,則需要使用quoteIdentifier()分隔它們。 例:

     $select->where($db->quoteIdentifier('order').'=?', $myVariable) 
  • Zend_Db_Adapter_Abstract::insert( array('colname' => 'value') )

    表名稱和列名稱是分隔的,除非您關閉AUTO_QUOTE_IDENTIFIERS

    將值參數化為真實查詢參數(未插入)。 除非該值是Zend_Db_Expr對象,在這種情況下,它是逐字插值的,因此您可以插入表達式或NULL或其他任何內容。

  • Zend_Db_Adapter_Abstract::update( array('colname' => 'value'), $where )

    表名稱和列名稱是分隔的,除非您關閉AUTO_QUOTE_IDENTIFIERS

    值是參數化的,除非它們是Zend_Db_Expr對象,如insert()方法。

    $where參數根本沒有被過濾,所以你要對那個中的任何SQL注入風險負責。 您可以使用quoteInto()方法來幫助使引用更方便。

是。 http://framework.zend.com/manual/en/zend.db.select.html 別擔心。 你持懷疑態度是正確的。

默認情況下,在SQL查詢中使用值綁定時,如下所示:

where('first_name=?', $id);

Zend_Db使用適當的值引用來防止SQL注入。 雖然強烈建議(通過書籍,文章,手冊和自我體驗)清理/過濾用戶輸入。 Zend_Filter非常有幫助。

應該讓你覺得安全的一點是? 在where子句中標記。 這些參數由數據庫系統安全地替換為第二個參數。

當你需要它在其他地方(比如在連接中)或者你不確定它是否會被轉義然后你總是可以使用$this->getAdapter()->quoteInto('type = ?',1);

過濾輸入總是很好,因為它可能會在某個地方而不僅僅是數據庫,並且您至少需要在某個級別的數據庫中獲得理智的數據。

  • Zend_Filter_Input在路上
  • 准備好的陳述(如果沒有准備好,則為quoteInto)
  • 逃離過濾器(htmlentities等)。

有一點是,當值為NULL時,您可以獲得無效的查詢

$value = NULL;
$select->where('prop=?', $value);

結果:SQL錯誤

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM