プロジェクトのチームリーダーである間(バージョン1.0まで)、ZendFrameworkでデータベースパラメーターと引用符のコードをたくさん書きました。
可能な限りベストプラクティスを奨励しようとしましたが、使いやすさとバランスをとる必要がありました。
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)
値は適切に引用されています。 「
?
"はパラメータのプレースホルダーのように見えます。このメソッドでは、引数は実際に適切に引用されて補間されます。したがって、これは真のクエリパラメータではありません。実際、次の2つのステートメントは、上記の使用法とまったく同じクエリを生成します。$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()
を利用できます 見積もりをより便利にする方法。