Sihirli alıntılar - Magic quotes - Wikipedia

Sihirli alıntılar bir özelliğiydi PHP komut dosyası dili burada Teller otomatik olarak kaçtı —Özel karakterlerin önünde bir ters eğik çizgi - vefat edilmeden önce. Yeni gelenlerin manuel kaçış gerektirmeden çalışan SQL komutları yazmalarına yardımcı olmak için tanıtıldı. Daha sonra deneyimsiz geliştiricilerin yazı yazmasını engellemek için tasarlandı kodu savunmasızdı SQL enjeksiyonu saldırılar.

Bu özellik resmi olarak PHP 5.3.0'dan itibaren kullanımdan kaldırılmış ve güvenlik kaygıları nedeniyle PHP 5.4'te kaldırılmıştır.[1]

Konsept

PHP kılavuzunun mevcut revizyonu, sihirli alıntıların arkasındaki mantığın "yeni başlayanlar tarafından yazılan kodun tehlikeli olmasını önlemeye yardımcı olmak" olduğunu belirtiyor.[2] Ancak orijinal olarak PHP 2'de msql için bir php.h derleme zamanı ayarı olarak tanıtıldı, yalnızca tek tırnaktan kaçarak "form verilerini doğrudan msql sorgularına iletmeyi kolaylaştırdı".[3] Başlangıçta, bir [a] güvenlik özelliği olarak değil, bir kolaylık özelliği olarak tasarlanmıştı.[4][5]

Sihirli tırnaklar için kullanım kapsamı PHP 3'te genişletildi. Kullanıcı tarafından sağlanan tüm verilerdeki tek tırnak işaretleri, çift tırnak işaretleri, ters eğik çizgiler ve boş karakterlerin hepsinde, komut dosyasındaki betiğe aktarılmadan önce başlarına bir ters eğik çizgi eklenir. $ _GET, $ _REQUEST, $ _POST ve $ _COOKIE genel değişkenler. Geliştiriciler daha sonra teoride kullanıcı tarafından sağlanan verilerle güvenli SQL sorguları oluşturmak için dize birleştirmeyi kullanabilir. (Bu, PHP 2 ve PHP 3 geçerli olduğunda en doğruydu, çünkü desteklenen birincil veritabanları yalnızca 1 baytlık karakter kümelerine izin veriyordu.)

Eleştiri

Yeni PHP 3 ve 4 kurulumlarında sihirli tırnaklar varsayılan olarak etkinleştirilmiştir, ancak magic_quotes_gpc yapılandırma yönergesi. Büyülü alıntıların işleyişi perde arkasında olduğundan ve hemen belli olmadığından, geliştiriciler onların varlığından ve getirebilecekleri olası sorunlardan habersiz olabilirler. PHP belgeleri birkaç tuzağa dikkat çekti ve varsayılan olarak etkinleştirilmesine rağmen devre dışı bırakılmalarını tavsiye etti.[6]

Sihirli alıntılarla ilgili sorunlar şunları içerir:

  • Kullanıcı tarafından sağlanan tüm verilerin bir veritabanına eklenmesi amaçlanmamıştır. Doğrudan ekranda görüntülenebilir, bir oturumda saklanabilir veya kaydetmeden önce önizlenebilir. Bu, istenmeyen yerlerde ters eğik çizgi eklenmesine ve son kullanıcıya gösterilmesine neden olabilir. Bu hata genellikle yaygın olarak kullanılan yazılımlara bile sızar.[7]
  • Kullanıcı tarafından sağlanan ve bir veritabanı sorgusunda kullanılan tüm veriler doğrudan sihirli alıntılarla korunan kaynaklardan elde edilmez. Örneğin, kullanıcı tarafından sağlanan bir değer bir veritabanına girilebilir, sihirli tırnak işaretleri ile korunabilir ve daha sonra veritabanından alınabilir ve sonraki bir veritabanı işleminde kullanılabilir. İkinci kullanım sihirli alıntılarla korunmaz ve onlara güvenmeye alışmış saf bir programcı onu açıkça koruma ihtiyacının farkında olmayabilir.
  • Sihirli alıntılar ayrıca PHP'nin sağladığı genel işlevselliği kullanır. addslashes () Unicode farkında olmayan ve bazı çok baytlı karakter kodlamalarında SQL enjeksiyon güvenlik açıklarına maruz kalan işlev. Veritabanına özgü işlevler, örneğin mysql_real_escape_string () veya mümkün olan yerlerde bağlı parametrelerle hazırlanmış sorgular tercih edilir.[8][9]
  • Birçok iken Veritabanı Yönetim Sistemleri ters eğik çizgiyle kaçan tırnak işaretlerini destekler, standart aslında başka bir alıntı kullanmayı gerektirir. Sihirli tırnaklar, ters eğik çizgiyle kaçan tırnak işaretlerini desteklemek için ayarlanmayan veritabanları için koruma sağlamaz.
  • Taşınabilirlik, bir uygulama sihirli tırnak işaretlerinin etkinleştirildiği ve ardından devre dışı bırakıldıkları bir sunucuya veya tam tersi olduğu varsayımıyla kodlandıysa bir sorundur.
  • Sihirli tırnaklar eklemek ve ardından bunları uygun olan yerlerde kaldırmak, küçük ama gereksiz miktarda performans yüküne neden olur.
  • Sihirli tırnaklar, diğer yaygın güvenlik açıklarına karşı koruma sağlamaz. siteler arası komut dosyası oluşturma saldırılar veya SMTP başlık enjeksiyonu saldırılar.

Kasım 2005'te çekirdek PHP geliştiricileri, bu sorunlar nedeniyle sihirli tırnak özelliğinin PHP 6'dan kaldırılacağına karar verdiler.[10] PHP 6'nın geliştirilmesi durduğunda ve bunun yerine 5.x dalında geliştirme devam ettiğinde, özellik PHP 5.3.0'da kullanımdan kaldırıldı ve 5.4'te kaldırıldı.[1]

Diğer yaklaşımlar

  • Gibi bazı diller Perl[11] ve Yakut[12] içeren bir yaklaşımı seçin veri lekeleme, kullanıcı girdisi gibi güvenilmeyen kaynaklardan gelen verilerin "bozuk" olduğu ve genellikle doğrulamadan veya kodlamadan sonra, açıkça güvenilir olarak işaretlenene kadar tehlikeli işlemlerde kullanılamayacağı durumlarda. SQL sorgularının oluşturulması bu bağlamda "tehlikeli" kabul edildiğinden, bu, programcıyı sorunu ele almaya zorlar. Kirlenme sorunu çözmez, ancak programcının bunları uygun şekilde çözebilmesi için bir problemin olduğu durumları vurgular.
  • Joel Spolsky bir biçim kullanmayı önerdi Macar gösterimi verilerin güvenli olup olmadığını gösterir.[13]
  • Modern veritabanı motorları ve kitaplıkları parametreli sorgular verileri veritabanına SQL komutlarından ayrı olarak iletmek, sorguları oluşturmadan önce verilerden çıkma ihtiyacını büyük ölçüde azaltır.

Ayrıca bakınız

Referanslar

  1. ^ a b "Sihirli Alıntılar". PHP Kılavuzu. PHP.net. Alındı 2014-01-17.
  2. ^ "PHP: Neden sihirli tırnaklar kullanmalı?". PHP belgeleri. Alındı 2007-02-19.
  3. ^ "MAGIC_QUOTES değişkeni php.h dosyasında tanımlanmışsa, bu tırnaklar otomatik olarak önlenerek form verilerini doğrudan msql sorgularına iletmeyi kolaylaştıracaktır". Alındı 2011-03-27.
  4. ^ "Magic Quotes, kalfalar PHP programcıları tarafından bile sıklıkla anlaşılır".
  5. ^ "Re: [PHP3] magic_quotes nedir?". PHP-dev posta listesi. 1999-08-27. Alındı 2011-01-17.
  6. ^ "PHP: Neden sihirli tırnaklar kullanmayalım". PHP belgeleri. Alındı 2007-02-19.
  7. ^ "Bir yorumu düzenlerken tırnak işaretleri iki kez önden çıkarılıyor". WordPress sorun izleyici. Alındı 2007-02-19.
  8. ^ Chris Shiflett. "addslashes () ile mysql_real_escape_string ()". Alındı 2007-02-19.
  9. ^ MySQL AB. "5.0.22 sürümündeki değişiklikler (24 Mayıs 2006)". MySQL 5.0 Referans Kılavuzu. Arşivlenen orijinal 22 Şubat 2007. Alındı 2007-02-19.
  10. ^ PHP Grubu (2005-11-12). "Dakikalar PHP Geliştiricileri Toplantısı". Alındı 2007-02-19.
  11. ^ Dan Ragle (2006-04-18). "Perl'in Bozukluk Moduna Giriş". webreference.com. Alındı 2007-03-21.
  12. ^ "Ruby'yi Kasaya Kilitlemek". Ruby Programlama. Arşivlenen orijinal 2009-05-30 tarihinde. Alındı 2014-05-21.
  13. ^ Joel Spolsky (2005-05-11). "Yanlış Kodu Yanlış Göstermek". Joel on Software: Ağrısız Yazılım Yönetimi. Alındı 2007-02-19.

Dış bağlantılar