Zend_Db sınıfı ile MySQL enjeksiyonları kaçınarak

7 Cevap php

I currently use Zend_Db to manage my queries. I've written already code that preforms queries like the one below:

$handle->select()->from('user_id')
                   ->where('first_name=?', $id)
                   ->where('last_name=?', $lname)

Ben Zend_Db olacak varsayarak, giriş sterilize olmadan yaptık. Zend bu yapar mı?

Another question: Does Zend_Db sanitize insert('table', $data) and update queries?

Teşekkürler.

7 Cevap

Ben (sürüm 1.0 kadar) proje için takım kurşun iken ben veritabanı parametreleri ve Zend Framework alıntı için bir sürü kod yazdı.

Ben mümkün olduğunca en iyi uygulamaları teşvik etmek için çalıştı, ama ben kullanım kolaylığı ile bir denge vardı.

Bunu her zaman alıntı yapmaya karar nasıl görmek için, bir Zend_Db_Select nesnesinin dize değerini incelemek unutmayın.

print $select; // invokes __toString() method

Ayrıca Zend_Db tarafından sizin adınıza çalıştırılan SQL incelemek için Zend_Db_Profiler kullanabilirsiniz.

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

İşte özel sorulara bazı cevaplar:

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

    Değerler uygun cinsindendir. "?" parametresi tutucusu gibi görünüyor olsa da, bu yöntemde argüman aslında uygun alıntı ve interpolasyon. Bu yüzden gerçek bir sorgu parametresi değil. Aslında, aşağıdaki iki ifadeler yukarıdaki kullanım tam olarak aynı sorgu üretmek:

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

    Eğer türü Zend_Db_Expr bir nesne parametre geçirmek Ancak, o alıntı değil. Bu ifade değerleri desteklemek için, kelimesi kelimesine interpolasyon çünkü, SQL enjeksiyon risklerden sorumlu konum:

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

    Kote veya ayrılmış gerektiğini ifade herhangi bir diğer kısmı sizin sorumluluğunuzdadır. Eğer ifadenin içine herhangi bir PHP değişkenleri interpolate örneğin eğer, güvenlik sizin sorumluluğunuzdadır. SQL anahtar kelimeler sütun adları varsa, quoteIdentifier() ile onlara kendinizi sınırlandırmak gerekir. Örnek:

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

    Eğer AUTO_QUOTE_IDENTIFIERS kapatmadığınız sürece tablo adı ve kolon isimleri, sınırlandırılır.

    Değerler (interpolasyon değil) gerçek sorgu parametreleri gibi parametreli. Değeri, kelimesi kelimesine interpolated oluyor bu durumda bir Zend_Db_Expr nesne olduğunu, bu yüzden sürece ifadeler eklemek veya NULL ya da her neyse olabilir.

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

    Eğer AUTO_QUOTE_IDENTIFIERS kapatmadığınız sürece tablo adı ve kolon isimleri, sınırlandırılır.

    Bu insert() yönteminde olarak Zend_Db_Expr nesneler olmadıkça değerler, parametreli bulunmaktadır.

    $where argüman tüm süzülmüş, böylece bu birinde herhangi bir SQL enjeksiyon risklerden sorumlu değilsin değildir. Sen daha rahat alıntı yapmak yardımcı olmak için quoteInto() yöntemi yararlanabilirler.

Varsayılan olarak bu gibi SQL sorguları bağlama değeri kullandığınızda:

where('first_name=?', $id);

Zend_Db SQL enjeksiyonu önlemek için değerlerin alıntı uygun kullanır. kuvvetle / filtre kullanıcı girdiyi (kitaplar, makaleler, kılavuzlar ve öz deneyimi ile) tavsiye edilir rağmen. Zend_Filter çok yararlı olabilir.

Güvende hissettirmek gerekir biti nedir? nerede cümlelerinde işaretleri. Bu güvenle veritabanı sistemi tarafından ikinci argümanı ile değiştirilir parametreler vardır.

Eğer başka bir yere ihtiyacınız olduğunda kaçtı olacak eğer her zaman kullanabilirsiniz $this->getAdapter()->quoteInto('type = ?',1); olabilir (gibi katılmak) ya da emin değilseniz

Sadece DB başka yerde gidiyorum, ve en azından bazı düzeyde veritabanı aklı başında verileri istediğiniz muhtemeldir çünkü Filtreleme girişi, her zaman iyidir.

  • Zend_Filter_Input şekilde üzerinde
  • Hazırlanan tablolar (ya da quoteInto eğer bir hazırlanmış olarak)
  • Çıkış yolu (htmlentities, vb) filtreleri Escape.

Bu konuda bir şey, değer NULL olduğunda, değil geçerli bir sorgu başarmak olabilir

$value = NULL;
$select->where('prop=?', $value);

Sonuç: SQL hatası

Evet. Bkz http://framework.zend.com/manual/en/zend.db.select.html. Merak etmeyin. Sen şüpheci olması haklısın.