sql >> データベース >  >> RDS >> Mysql

Zend_DbクラスによるMySQLインジェクションの回避

    プロジェクトのチームリーダーである間(バージョン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()を利用できます 見積もりをより便利にする方法。



    1. mysqlで個別の2列の組み合わせを選択する

    2. 重複キーで無視しますか?

    3. 日付から曜日を選択

    4. MySQL selectでXPATHを使用する方法は?