2017-05-02 4 views
1

私はzf 2.4で、この例ではZend \ db \ sqlを使用しています。私はSQLインジェクションについて心配する必要はありますか?また、すでにprepareStatementForSqlObject()を使用している場合はquote()を実行するか、何かをエスケープする必要はありますか?以下の例では、blind変数をすでに実行していますか?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クラスは、巧みにあなたの述語(複数可)をチェックし、SQLインジェクションを防ぐために、クエリに安全な方法でそれらを追加します。私はあなた自身のためにソースを見てお勧めしたいので、最新のZFバージョンでこれを担当するプロセスとクラスを指摘します。

述語処理
クラスPredicateSetを見てみましょう。メソッド\Zend\Db\Sql\Predicate::addPredicatesは、その型に基づいて述語を処理する最良の方法を決定します。あなたの場合、連想配列を使用しています。その配列内のすべての項目は、タイプに基づいてチェックされ、処理されます。

  • 抽象化置換文字(questionmark)が発見された場合、それはExpressionに変換されます。
  • 値がNULLの場合、キーに見つかった列のIS NULLチェックが実行されます(WHERE key IS NULL)。
  • 値が配列の場合、キーで見つかった列でINチェックが実行されます。
  • それ以外の場合、述部は、Operatorというタイプの「等しい」:WHERE key = valueになります。

各場合においてSelectに追加される最終的な述語方法\Zend\Db\Sql\Sql::prepareStatementForSqlObjectがされるステートメントを作成するために、そのアダプタ(すなわちPDO)を指示文
準備PredicateInterface

を実装します準備された。ここから少し複雑になります。機能vsprintfは、クエリ文字列を構築するために使用される\Zend\Db\Sql::createSqlFromSpecificationAndParameterssee hereすることができますように本当の魔法は、どこの方法で行わどこ

\Zend\Db\Sqlです。

注:
ここから新しいdocs.framework.zend.comウェブサイトをご利用ください。このウェブサイトは、最新バージョンのドキュメントについては、主導的な役割を果たしています。

+0

私が言及したように、私は2.4を使用しているので、代わりにそのドキュメントを使用しています。情報をありがとう。 – sparkmix

+0

これはあなたを助けますか?あなたの質問に答えたら私の答えを受け入れることを検討してください。 –

関連する問題