2017-05-02 51 views
1

我在Zend \ db \ sql中使用zf 2.4和本例。如果我已經使用prepareStatementForSqlObject(),我需要擔心sql注入還是需要執行quote()或轉義任何東西?下面的例子已經做了盲變量了嗎?Zend db sql - prepareStatementForSqlObject - 仍然需要綁定或擔心sql注入?

https://framework.zend.com/manual/2.4/en/modules/zend.db.sql.html

use Zend\Db\Sql\Sql; 
$sql = new Sql($adapter); 
$select = $sql->select(); 
$select->from('foo'); 
$select->where(array('id' => $id)); 

$statement = $sql->prepareStatementForSqlObject($select); 
$results = $statement->execute(); 

回答

0

Select類將巧妙地檢查你的謂詞(S)和以安全的方式將它們添加到查詢,以防止SQL注入。我建議你自己看一下源代碼,所以我會告訴你最新的ZF版本的流程和負責這個的類。

謂詞處理
看一看類PredicateSet。方法\Zend\Db\Sql\Predicate::addPredicates確定了根據其類型處理謂詞的最佳方式。在你的情況下,你正在使用一個關聯數組。該數組中的每一項將根據類型進行檢查和處理:

  • 如果找到一個抽象替換字符(問號),它會變成一個Expression
  • 如果值爲NULL,則將在密鑰WHERE key IS NULL中找到的列上執行IS NULL檢查。
  • 如果該值是一個數組,並且將在密鑰中找到的列上執行IN檢查:WHERE key IN (arrayVal1, arrayVal2, ...)
  • 否則,謂詞將是類型'equals'的新OperatorWHERE key = value

在每種情況下的最終謂詞被添加到Select將實施PredicateInterface

準備聲明
方法\Zend\Db\Sql\Sql::prepareStatementForSqlObject指示其適配器(即PDO)來創建,這將是一個語句準備。從這裏開始會變得更復雜一些。

\Zend\Db\Sql是真正的奇蹟發生在哪裏在方法\Zend\Db\Sql::createSqlFromSpecificationAndParameters功能vsprintf用於建立查詢字符串,你可以see here

備註
從現在開始請考慮使用新的docs.framework.zend.com網站。當涉及到最新版本的文檔時,該網站處於領先地位。

+0

正如我所說的,我正在使用2.4,所以這就是爲什麼我使用該文檔。謝謝(你的)信息。 – sparkmix

+0

這對你有幫助嗎?如果它回答你的問題,請考慮接受我的答案。 –