Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

menghindari injeksi MySQL dengan kelas Zend_Db

Saya menulis banyak kode untuk parameter database dan mengutip di Zend Framework saat saya memimpin tim untuk proyek tersebut (hingga versi 1.0).

Saya mencoba mendorong praktik terbaik jika memungkinkan, tetapi saya harus menyeimbangkannya dengan kemudahan penggunaan.

Perhatikan bahwa Anda selalu dapat memeriksa nilai string dari Zend_Db_Select objek, untuk melihat bagaimana ia telah memutuskan untuk melakukan kutipan.

print $select; // invokes __toString() method

Anda juga dapat menggunakan Zend_Db_Profiler untuk memeriksa SQL yang dijalankan atas nama Anda oleh Zend_Db .

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

Berikut adalah beberapa jawaban untuk pertanyaan spesifik Anda:

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

    Nilai dikutip dengan tepat. Meskipun "? " terlihat seperti placeholder parameter, dalam metode ini argumen sebenarnya dikutip dengan tepat dan diinterpolasi. Jadi itu bukan parameter kueri yang sebenarnya. Sebenarnya, dua pernyataan berikut menghasilkan kueri yang persis sama dengan penggunaan di atas:

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

    Namun, jika Anda melewatkan parameter yang merupakan objek dengan tipe Zend_Db_Expr , maka itu tidak dikutip. Anda bertanggung jawab atas risiko injeksi SQL, karena ini diinterpolasi kata demi kata, untuk mendukung nilai ekspresi:

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

    Bagian lain dari ungkapan itu yang perlu dikutip atau dibatasi adalah tanggung jawab Anda. Misalnya, jika Anda menginterpolasi variabel PHP apa pun ke dalam ekspresi, keamanan adalah tanggung jawab Anda. Jika Anda memiliki nama kolom yang merupakan kata kunci SQL, Anda harus membatasinya sendiri dengan quoteIdentifier() . Contoh:

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

    Nama tabel dan nama kolom dipisahkan, kecuali jika Anda menonaktifkan AUTO_QUOTE_IDENTIFIERS .

    Nilai diparameterisasi sebagai parameter kueri yang sebenarnya (tidak diinterpolasi). Kecuali jika nilainya adalah Zend_Db_Expr objek, dalam hal ini diinterpolasi kata demi kata, sehingga Anda dapat menyisipkan ekspresi atau NULL atau apa pun.

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

    Nama tabel dan nama kolom dipisahkan, kecuali jika Anda menonaktifkan AUTO_QUOTE_IDENTIFIERS .

    Nilai diparameterisasi, kecuali jika Zend_Db_Expr objek, seperti dalam insert() metode.

    $where argumen tidak difilter sama sekali, jadi Anda bertanggung jawab atas risiko injeksi SQL apa pun di dalamnya. Anda dapat menggunakan quoteInto() metode untuk membantu membuat kutipan lebih nyaman.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tidak dapat memuat Driver QMYSQL di PySide2

  2. Kapan menggunakan LEFT JOIN dan kapan menggunakan INNER JOIN?

  3. Dengan PDO, bagaimana saya bisa memastikan bahwa pernyataan UPDATE berhasil?

  4. mysqldump dengan membuat baris database

  5. Impor batas ukuran file di PHPMyAdmin