Sihirli tırnak - Magic quotes
Sihirli tırnak bir özelliği olan PHP kodlama dili burada, dizeleri otomatik edilir kaçan -Özel karakterler öneki ile ters eğik çizgi üzerinde geçirilen bakılırsa. Bu yeni gelenler manuel kaçışa gerektirmeden SQL komutları işleyen yazma yardımcı tanıtıldı. Yazmaktan deneyimsiz önleme amaçlıdır gibi sonradan nitelendirildi kod karşı savunmasız olduğu SQL enjeksiyon saldırıları.
Bu özellik resmen güvenlik kaygıları nedeniyle, PHP 5.4 PHP 5.3.0 itibariyle önerilmemektedir ve çıkarıldı.
kavram
PHP kılavuzun güncel revizyon sihirli tırnak arkasındaki mantık etmek olduğunu bahseder "yardım [önlemek] tehlikeli olmaktan başlayanlar tarafından yazılan kodu." Ancak başlangıçta "daha kolay sorguları mSQL doğrudan form verilerini geçmek yapmak", bir php.h derleme zamanında yalnızca tek tırnak kaçan, mSQL ayarı olarak PHP 2'de tanıtıldı. Başlangıçta bir olarak düşünülmüştü "kolaylık özelliği, değil [a] güvenlik özelliği."
Sihirli tırnaklar için kullanılması kapsamı hepsi ters eğik çizgi içinde komut geçirilmeden önce kendilerine önüne sahip tüm kullanıcı tarafından sağlanan verilere PHP'de 3. Tek tırnak, çift tırnak, ters eğik ve boş karakterler genişletildi $_GET, $_REQUEST, $_POSTve $_COOKIEküresel değişkenler. Geliştiriciler sonra teoride kullanıcı tarafından sağlanan verilerle güvenli SQL sorguları oluşturmak için dize birleştirme kullanabilirsiniz. (Primer desteklenen veri tabanları, sadece 1 bayt karakter setleri izin yana PHP 2 ve PHP 3, mevcut olduğu zaman bu en doğru oldu.)
eleştiri
Sihirli tırnak PHP 3 ve 4 yeni tesislerde varsayılan olarak etkin, ancak devre dışı bırakılabilir olabilir magic_quotes_gpc yapılandırma yönergesi. Sihirli tırnak işletiminin hemen aşikar sahneleri değil arkasında olduğu için, geliştiricilerin varlığı ve onlar tanıtmak potansiyel problemlerin farkında olmuş olabilir. PHP belgelerine birkaç tuzaklara dikkat çekti ve varsayılan olarak etkin olmasına rağmen, bunlar devre dışı bırakılmalıdır, tavsiye etti.
Sihirli tırnak sorunları şunlardır:
- kullanıcı tarafından sağlanan tüm veriler bir veri tabanı içine sokulmak üzere tasarlanmıştır. Onlar kaydetmeden önce, ekrana direkt hale saklanan bir oturumda veya önizleme olabilir. Bu istedikleri edilmez ve son kullanıcıya göstermeden nerede ters eğik çizgiler eklendi sayılmasına neden olabilir. Bu hata genellikle bile yaygın olarak kullanılan yazılım doğru sürünüyor.
- Bir veritabanı sorguda kullanıcı tarafından sağlanan ve kullanılan tüm veriler sihirli tırnak ile korunan kaynaklardan doğrudan elde edilir. Örneğin, kullanıcı tarafından sağlanan bir değer sihirli tırnak ile korunmaktadır, bir veritabanına takılı olabilir, ve daha sonra veritabanından alınan ve takip eden bir veritabanı işlemi kullanılır. İkinci kullanım sihirli tırnak ile korunan değildir ve onlara güvenerek için kullanılan bir naif programcı açıkça onu korumak için ihtiyaç habersiz olabilir.
- Sihirli tırnaklar da PHP'nin sağladığı genel işlevini kullanmak
addslashes()Unicode ile uyumlu değildir ve hala bazı çoklu byte karakter SQL enjeksiyon açıkları tabidir fonksiyon. Veritabanı özgü gibi işlevlerimysql_real_escape_string()bağlı parametreler ile mümkün hazırlanan sorgular tercih edilir ya da. - Birçok iken veritabanı yönetim sistemleri desteği ters eğik çizgi tırnak kaçan, standart aslında başka alıntı kullanmak için çağırır. Sihirli tırnak değil ters eğik çizgi kaçan tırnak desteklemek üzere kurulmuş veritabanları için hiçbir koruma sağlamaz.
- Bir uygulama sihirli tırnak etkindir ve daha sonra tam tersi devre dışı bırakılır veya bir sunucuya taşınır varsayımıyla kodlanmış ise Taşınabilirlik bir konudur.
- Uygun performans yükünü küçük ama gereksiz miktarda doğurur nerede bunları kaldırmayı sonradan sihirli tırnak ekleme.
- Sihirli tırnak gibi diğer ortak güvenlik açıklarına karşı koruma sağlamadığı siteler arası komut dosyası saldırıları veya SMTP başlık enjeksiyon saldırıları.
2005 yılı Kasım ayında çekirdek PHP geliştiricileri PHP 6 gelişmesi durmuş ve geliştirme yerine, özellik PHP 5.3 kullanımdan kaldırıldı 5.x dala devam edince bu sorunlar nedeniyle, sihirli tırnak PHP 6. kaldırılıyordu özelliği olduğuna karar verdi. 0 ve 5.4 uzaklaştırıldı.
Diğer yaklaşımlar
- Gibi bazı diller Perl ve Ruby karıştığı bir yaklaşım için tercih veri beneklenmesıne Böyle bir kullanıcı girişi olarak güvenilmeyen kaynaklardan gelen veriler, "kusurlu" olarak kabul edilir ve açık bir şekilde genellikle onaylanmış veya kodlanmış sonra kadar güvenilir işaretlenmiş kadar tehlikeli işlemler için kullanılamaz, . SQL sorguları inşası bu bağlamda "tehlikeli" olarak kabul edildiğinden, bu sorunu çözmek için programcı zorlar. Lekelenme sorunu çözmez, ancak programcı uygun bunları çözmek mümkün olduğunu böylece bir sorun olduğunda bu örnekleri vurgulamak yok.
- Joel Spolsky bir formu kullanarak önerdi Macar gösterimle verileri güvenli veya güvensiz olup olmadığını gösterir.
- Modern veritabanı motorları ve kütüphaneler kullanmak Parametrelenmiş sorguları büyük ölçüde sorguları oluşturmadan önce verileri kaçmak gereği ortadan SQL komutları ayrı veritabanına veri aktarmak.