Bugünkü yazımızda son zamanlarda pek çok kişinin dikkatini çeken bir konu olan PHP konusunu inceleyeceğiz. Kökeni, mevcut toplum üzerindeki etkisi ve farklı alanlardaki olası etkileri hakkında daha fazla bilgi edineceğiz. Ayrıca PHP ile ilgili son araştırma ve keşiflerin yanı sıra konuyla ilgili uzmanların bazı görüşlerini de analiz edeceğiz. Bu makale şüphesiz bu büyüleyici konuya ilişkin derin ve kapsamlı bir bakış açısı sağlayacak ve okuyucularımıza PHP hakkında daha geniş bir bakış açısı ve daha iyi bir anlayış sunacaktır.
Paradigması | çok paradigmalı: zorunlu, nesne yönelimli, yordamsal, yansıtıcı |
---|---|
İlk çıkışı | 8 Haziran 1995 | )
Tasarımcı | Rasmus Lerdorf |
Geliştirici | PHP Grubu, Zend Technologies, PHP Foundation |
Kararlı sürüm | 8.3.2 (18 Ocak 2024 | ) )
Önemli uygulamaları | Zend Engine, Phalanger, Quercus, Project Zero, HipHop |
Etkilendikleri | C, Perl, Java, C++, Tcl |
Etkiledikleri | Php4delphi, Hack JSP, ASP |
Uygulama dili | C |
Platformu | çapraz platform |
Lisans | PHP Lisansı |
Olağan dosya uzantıları | .php,.phar,.phtml,.pht,.phps |
Web sitesi | www.php.net |
PHP: Hypertext Preprocessor (Türkçe: Üstünyazı Önişlemcisi[1]) (Aslen: Personal Home Page - Kişisel Ana Sayfa), internet için üretilmiş, sunucu taraflı, çok geniş kullanımlı, genel amaçlı, içerisine HTML gömülebilen betik ve programlama dilidir.[1] İlk kez 1995 yılında Rasmus Lerdorf tarafından yaratılan PHP'nin geliştirilmesi bugün PHP topluluğu tarafından sürdürülmektedir. Ocak 2013 itibarıyla 244 milyondan fazla web sitesi PHP ile çalışırken 2.1 milyon web sunucusunda PHP kurulumu bulunmaktadır.[2]
PHP kodları PHP işleme modülü bulunan bir web sunucusu tarafından yorumlanır ve çıktı olarak web sayfası üretilir. Bu kodlar veriyi işlemek üzere harici bir dosyaya kaydedilerek çağırılabildiği gibi doğrudan HTML kodunun içine de gömülebilir. PHP zaman içinde bir komut satırı arayüzü sunacak şekilde evrilmiştir, PHP-GTK yardımıyla grafiksel masaüstü uygulaması geliştirmek de mümkündür.[3]
PHP özgür bir yazılım olup PHP Lisansı ile dağıtılmaktadır. Bu lisans kullanım şartları kısmında GNU Genel Kamu Lisansı ile örtüşmese de, PHP tüm web sunuculara ve hemen hemen tüm işletim sistemi ve platforma ücretsiz olarak yüklenebilir.[4]
PHP'nin geliştirilmesi 1994 yılında Rasmus Lerdorf'un kişisel web sitesini yönetmek için bir takım CGI (İngilizce: Common Gateway Interface) Perl betikleri yazmasıyla başladı. Rasmus bu betikler yardımıyla özgeçmişini sitede görüntülüyor ve sitenin ziyaretçi trafiğini kaydediyordu. Bir süre sonra web formları ile etkileşime girebilecek, veritabanları ile iletişim kurabilecek ve daha hızlı çalışabilecek şekilde bu betikleri C ile yeniden kodladı ve bu uygulamaya Kişisel Ana Sayfa/Form Yorumlayıcı (PHP/FI, İngilizce: Personal Home Page/Forms Interpreter) adını verdi. PHP/FI yardımıyla basit anlamda dinamik web siteleri oluşturmak oldukça kolaydı. Rasmus, 8 Haziran 1995 tarihinde hata ayıklama sürecini hızlandırmak ve kaynak kodu iyileştirmek üzere bir Usenet tartışma grubunda PHP/FI uygulamasını Personal Home Page Tools (PHP Tools) adıyla ilk kez duyurdu. 2013 yılı itibarıyla PHP içinde mevcut olan Perl benzeri değişken tanımlama, form yönetimi ve betik kodları arasına HTML kodu yerleştirebilme gibi temel özellikler bu ilk sürümde de mevcuttu. Sözdizimi genel olarak Perl'e benzese de daha kısıtlı ve basit ancak daha tutarsızdı. Bir geliştirme takımıyla aylar süren çalışma ve test aşamalarının ardından PHP/FI 2 sürümü 1997 Kasım ayında resmi olarak duyuruldu.
Zeev Suraski ve Andi Gutmans 1997 yılında ayrımlayıcı'yı baştan yazdılar ve dilin ismini PHP: Hypertext Preprocessor olarak değiştirerek PHP 3 ün temellerini attılar. Bunu PHP 3 ün herkese açık olan test sürecinin başlaması izledi ve 1998 yılının Haziran ayında PHP 3 resmi olarak duyuruldu. Suraski ve Gutmans bu sürecin ardından PHP'nin çekirdeğini sil baştan kodlamak suretiyle 1999 yılında Zend Motorunu geliştirdiler ve İsrail'in Ramat Gan kentinde Zend Technologies isimli bir şirket kurdular.[5]
22 Mayıs 2000 tarihinde temelleri Zend Engine 1.0 ile güçlendirilmiş PHP 4 duyuruldu ve Ağustos 2008 itibarıyla 4.4.9 sürümüne ulaşana kadar aktif olarak geliştirildi.[6] Bugün PHP 4'ün geliştirilmesi durdurulmuştur ve güvenlik güncellemeleri dahil olmak üzere üzerinde hiçbir iyileştirme yapılmamaktadır.
13 Temmuz 2004 tarihinde yeni Zend Engine II ile güçlendirilmiş PHP 5 yayınlandı. PHP 5, nesneye yönelik programlama için çok daha fazla olanak sağlıyor, PHP Veri Nesneleri (PDO) eklentisi yardımıyla veritabanlarına erişim için oldukça tutarlı ve hızlı bir arayüz yanında performansa yönelik çok sayıda iyileştirme barındırıyordu.[7] 2008 yılında PHP 4 ün tutarlı sürümünün yayınlanması durduruldu ve PHP 5 geliştirilmesi devam eden tek tutarlı sürüm oldu. PHP duruk içselleştirim (İngilizce: Late static binding) özelliği barındırmıyordu ancak 5.3 sürümü ile bu önemli eksik giderildi.[8]
Anlamı | |
---|---|
Kırmızı | Artık desteklenmeyen sürüm |
Sarı | Yalnızca güvenlik düzeltmeleri alan sürüm |
Yeşil | Aktif olarak desteklenen sürüm |
Mavi | Gelecek sürüm ya da BETA, ALFA sürüm |
Ana Sürüm | Ek Sürüm | Yayın Tarihi | Notlar |
---|---|---|---|
1 | 1.0.0 | 1995-06-08 | "Personal Home Page Tools (Kişisel Anasayfa Araçları)" olarak anılıyordu ve kısaltımı "PHP" idi. |
2 | 2.0.0 | 1997-11-01 | Yaratıcısı ve geliştiricisi "en hızlı ve en sade araç" olarak, web sayfaları için geliştirdi. |
3 | 3.0.0 | 1998-06-06 | Sürüm kişisellikten, kurumsallığa geçti. Zeev Suraski ve Andi Gutmans tekrar basit dil bilgisini yazdı. |
4 | 4.0.0 | 2000-05-22 | Daha ileri seviye dil bilgisi eklendi / Zend Motoru denilen dil bilgisi denetleyicisi getirildi. |
4.1.0 | 2001-12-10 | 'Süper globaller' tanıştırıldı. ($_GET , $_POST , $_SESSION , $_SERVER vb...)
| |
4.2.0 | 2002-04-22 | register_globals öntanımlı olarak engellendi. | |
4.3.0 | 2002-12-27 | CLI tanıştırıldı, CGI ekleri yapıldı. | |
4.4.0 | 2005-07-11 | phpize ve php-config betikleri için eklenmeler yapıldı.
| |
4.4.8 | 2008-01-03 | Çoğu güvenlik sorunları ve hatalar düzeltildi. Son kalıcı PHP 4 sürümü oldu. Gerekli ise, güvenlik güncellemeleri 2008-08-08 e kadar sürdü. | |
4.4.9 | 2008-08-07 | Daha fazla açık onarıldı. PHP 4 serileri için son sürüm oldu. | |
5 | 5.0.0 | 2004-07-13 | Zend Motoru II ile yeni obje modelleri geliştirildi. |
5.1.0 | 2005-11-24 | Eklenen değişkenler ile performans artışı gözlemlendi. | |
5.2.0 | 2006-11-02 | Filtreleme öntenımlı olarak iptal edildi. | |
5.2.11 | 2009-09-16 | Hata ve güvenlik sorunları çözüldü. | |
5.2.12 | 2009-02-25 | Güvenlik ve veri tabanı iletişimi güçlendirildi. 60 adet hata düzeltildi. | |
5.2.13 | 2010-07-22 | Hatalar düzeltildi. | |
5.2.14 | 2010-12-17 | Hatalar düzeltildi. PHP 5.2.x sürümleri geliştirilmesi durduruldu. | |
5.3.0 | 2009-06-30 | Namespace desteği, Atlama kodları (goto ile limitlendi), Yerli PHP arşivlemesi (phar), Windows desteği arttırıldı, sqlite3 geliştirildi, fileinfo, mime_magic yerine daha iyi bir MIME desteği için getirildi, uluslararası olarak "ereg" kod yapısı iptal edildi. | |
5.3.1 | 2009-11-19 | 100'den fazla hata düzeltildi, bazı küçük sorunlar da düzeltildi. | |
5.3.2 | 2010-03-04 | Çok geniş bir hata düzeltimi yapıldı. | |
5.3.3 | 2010-07-22 | Başlıca hata ve güvenlik sorunları onarıldı. FPM[ölü/kırık bağlantı] | |
5.4 | 2012-03-01 | Trait desteği geldi, diziler için kısa sözdizimi desteği geldi. Register_globals, safe_mode, allow_call_time_pass_reference konfigürasyon değerleri session_register(), session_unregister() ve session_is_registered() metotları ile birlikte kaldırıldı. Dahili web sunucu desteği eklendi. Bellek kullanımı düşürüldü, mevcut fonksiyonelite üzerinde performansı artıran çok sayıda iyileştirme yapıldı. | |
5.5 | 2013-06-20 | Yeni makine kodu önbellekleme eklentisi (Zend Optimizer+) geldi. GD resim işleme kütüphanesine yeni fonksiyonlar eklendi. Parola şifreleme işlemlerini kolaylaştırmak ve daha üst seviyede güvenlik sunmak üzere password_hash() ve password_verify() metotları geldi. try {} catch() {} sözdizimine diğer üst seviye dillerde bulunan finally bloğu eklendi. | |
5.6 | 2014-08-28 | Belirsiz sayıda parametre alan fonksiyonlar (variadic functions), sabitlere (const) numerik işlemlerle (+, -, * ...) tanım yapabilme, üs alma operatörü (**) eklendi. | |
7 | 7.0 | 2015-12-03 | Zend Engine 3.0 ile önceki sürümlere göre performansı önemli derecede arttırıldı.[9] ?? Operatörü, <=> üç yollu karşılaştırma operatörü ve anonymous sınıflar eklendi. Unicode desteği geldi.
|
7.1 | 2016-12-01 | Void tipi eklendi, sınıf sabitlerini (const) kapsülleme, boşaltılabilir (nullable) tip, birden fazla hata (exception handling) yakalayabilme.[10] | |
7.2 | 2017-11-30 | Object tipi eklendi, abstract metodlar artık override edilebiliyor.[11] | |
7.3 | 2018-12-06 | is_countable fonsiyonu, Esnek Heredoc ve Nowdoc Sözdizimleri[12] | |
7.4 | 2019-11-28 | Ok fonksiyon, ön yükleme, sınıflarda tip özelliği, geliştirilmiş tip varyansları, dizilerde dağıtma operatoru, null işaretleme operatörü[13] | |
8 | 8.0 | 2020-12-3 | İsimli parametreler, union türleri, nitelikler, constructor nitelik promosyonu, nullsafe operatörü, match ifadesi, JIT(Just in Time), static türünde değer döndürme, mixed türü, throw ifadesi, nesnelerde ::class sözdizimi, try-catch sözdiziminin hata değişkeni belirtmeden kullanımı, parametre listelerinin sonunda virgül kullanımı, string değişkenlerde otomatik Stringable arayüze geçiş, str_contains() fonksiyonu, str_starts_with() ve str_ends_with() fonksiyonları, string birleştirme önceliği.[14][15] |
8.0.1 | 2021-01-07 | Bazı hatalar giderildi.[16] | |
8.0.2 | 2021-02-04 | Bazı hatalar giderildi.[17] | |
8.1.0 | 2021-11-25[18] | Sayılama (İngilizce: enum) desteği eklendi.[19] | |
8.2.0 | 2022-12-08[20] | Sadece okunabilir sınıflar (İngilizce: Readonly classes) eklendi.[21] | |
8.3.2 | 2024-01-18[22] | Sınıf sabitlerinin açıkça yazılması, salt okunur özelliklerin derinlemesine klonlanması ve rastgelelik işlevine yapılan eklemeler gibi birçok yeni özellik içerir. Her zaman olduğu gibi performans iyileştirmeleri, hata düzeltmeleri ve genel temizlik de içeriyor. |
PHP, özellikle MySQL veritabanıyla birlikte ve Linux işletim sistemi altında iyi bir performans sergilemektedir. C/C++ diline olan benzerliği nedeniyle bu dili önceden bilenlerin PHP öğrenmesi oldukça kolaydır. Kolay öğrenilmesi ve hızlı performansı nedeniyle Facebook, YouTube, Yahoo, Wikipedia ve OGame gibi dünyaca ünlü sitelerin yazımında kullanılmasına rağmen, kodların kolay anlaşılabilmesi açısından ve birden fazla programcı tarafından sürekli geliştirilmesi gerekli büyük projelerde Java'nın kullanılması daha uygun görülmektedir. Ancak sadece web tabanlı yazılımın geliştirilmesi söz konusu olduğunda Java'ya göre öğrenilmesinin daha kolay olması nedeniyle genellikle PHP tercih edilmektedir. PHP, web tasarımında önemli kolaylıklar sağlasa da 2005 te Google in AJAX kullanmaya başlamasından sonra tek başına öğrenilmesi yeterli olmamakta ve AJAX'ı öğrenmek için gerekli JavaScript, XML, HTML, (ve CSS) ile birlikte bir bütün oluşturabilmektedir.
Önemli PHP Geliştiricileri | |||||
---|---|---|---|---|---|
Rasmus Lerdorf | Andi Gutmans | Zeev Suraski | |||
Danimarka asıllı Kanadalı, programcı. PHP'nin mucidi ve geliştiricisi. Aynı zamanda Apache HTTP Sunucusu projesinin başlamasını sağladı. Joomla! gibi GNU PHP projelerin güvenliğini kontrol ediyor. | İsrail asıllı programcı. PHP'nin gelişmesinde çok büyük emeği olmuştur. Aynı zamanda Zend Motoru hakkındaki çalışmaları çok önemlidir. | İsrail asıllı programcı. Zend Motorunu icat etti. PHP için bir betik motoru ve aktif derleyici oluşturdu. |
Aşağıdaki örnek programda HTML içerisine gömülü PHP kodunu görebilirsiniz.
<!DOCTYPE html>
<html>
<head>
<title>PHP Testi</title>
</head>
<body>
<?php echo '<p>Merhaba Dünya</p>'; ?>
</body>
</html>
Unutmayın ki PHP kodunun HTML içerisinde gömülü olması zorunlu değildir. Benzeri bir program aşağıdaki gibi yazılabilir.
<?='Merhaba Dünya'?>
PHP yorumlayıcısı yalnızca sınırlayıcıları içindeki PHP kodunu yürütür. Sınırlayıcıları dışındaki hiçbir şey PHP tarafından işlenmez, ancak PHP olmayan metin hala PHP kodunda açıklanan kontrol yapılarına tabidir. En yaygın sınırlayıcılar PHP bölümlerini açmak için <?php
ve kapamak için ?>
kullanılır.<?
kısaltılmış şeklide vardır. Bu kısa ayraç, komut dosyalarının taşınabilirliğini azaltır çünkü yerel PHP yapılandırmasında bunlara yönelik destek devre dışı bırakılabilir ve bu nedenle önerilmez.[23][24] Buna karşılık, echo short <?=
etiketine karşı hiçbir öneri yoktur.[25]
PHP 5.4.0'dan önce, echo
için bu kısa sözdizimi yalnızca short_open_tag
yapılandırma ayarı etkinleştirildiğinde çalışırdı; PHP 5.4.0 ve sonraki sürümlerde ise her zaman kullanılabilir.[23][26][27]
Tüm bu sınırlayıcıların amacı, PHP kodunu JavaScript kodu veya HTML işaretlemesi gibi PHP dışı içerikten ayırmaktır.[28]
Yani PHP'de yazılmış en kısa "Merhaba, Dünya!" programı şöyledir:
<?='Merhaba Dünya!';
XHTML ve diğer XML belgelerindeki ilk sınırlayıcı biçimi olan <?php
ve ?>
, doğru biçimde oluşturulmuş XML işleme talimatları oluşturur.[29] Bu, sunucu tarafındaki dosyadaki PHP kodu ve diğer işaretlemelerin ortaya çıkan karışımının kendisinin iyi biçimlendirilmiş XML olduğu anlamına gelir.
Değişkenler dolar sembolüyle öneklenir ve bir türün önceden belirtilmesi gerekmez. PHP 5, işlevlerin parametrelerini belirli bir sınıfın, dizilerin, arayüzlerin veya geri çağırma işlevlerinin nesneleri olmaya zorlamalarına izin veren tür bildirimlerini tanıttı. Ancak, PHP 7'den önce, tür bildirimleri tam sayılar veya dizeler gibi skaler türlerle kullanılamazdı.[30]
Aşağıda PHP değişkenlerinin nasıl bildirildiği ve başlatıldığına dair bir örnek verilmiştir.
<?php
$name = 'John'; // bildirilen ve başlatılan dize türündeki değişken
$age = 18; // bildirilen ve başlatılan tamsayı türündeki değişken
$height = 5.3; // bildirilen ve başlatılan çift türündeki değişken
echo $name . ' is ' . $height . "m tall\n"; // değişkenleri ve dizeleri birleştirme
echo "$name is $age years old."; // değişkenleri dizeye ekleme
?>
Fonksiyon ve sınıf adlarının aksine, değişken adları büyük/küçük harfe duyarlıdır. Hem çift tırnaklı ("") hem de her iki metin dizesi (heredoc), bir değişkenin değerini dizeye ekleme olanağı sağlar.[31] PHP, serbest biçimli bir dil gibi yeni satırları beyazboşluk olarak ele alır ve ifadeler noktalı virgülle sonlandırılır.[32]
PHP'de üç tür yorum sözdizimi vardır: /* */
blok ve satır içi yorumları işaretler; //
veya #
tek satırlık yorumlar için kullanılır.[33] echo
ifadesi, PHP'nin metin çıktısı için sağladığı çeşitli olanaklardan biridir.
PHP, özellikle sunucu taraflı web geliştirmeye uygun genel amaçlı bir kodlama dilidir; bu durumda PHP genellikle bir web sunucusunda çalışır. İstenen dosyadaki herhangi bir PHP kodu, genellikle dinamik web sayfası içeriği veya web sitelerinde veya başka yerlerde kullanılan dinamik görüntüler oluşturmak için PHP çalışma zamanı tarafından yürütülür.[34] Ayrıca komut satırı komut dosyaları oluşturma ve istemci tarafı grafik kullanıcı arabirimi (GUI) uygulamaları için de kullanılabilir. PHP çoğu web sunucusuna, birçok işletim sistemine ve platforma dağıtılabilir ve birçok ilişkisel veritabanı yönetim sistemi (RDBMS) ile kullanılabilir. Çoğu web barındırma sağlayıcısı müşterileri tarafından kullanılmak üzere PHP'yi destekler. Ücretsiz olarak mevcuttur ve PHP Grubu, kullanıcıların kendi kullanımları için oluşturmaları, özelleştirmeleri ve genişletmeleri için eksiksiz kaynak kodu sağlar.[35]
Başlangıçta dinamik web sayfaları oluşturmak için tasarlanan PHP, artık esas olarak sunucu tarafı komut dosyası yazmaya odaklanmaktadır[36] ve Python, Microsoft'un ASP.NET, Sun Microsystems'in JavaServer Pages,[37] ve mod_perl
gibi web sunucusundan istemciye dinamik içerik sağlayan diğer sunucu tarafı komut dosyası dillerine benzer.
PHP ayrıca hızlı uygulama geliştirmeyi (RAD) teşvik etmek için yapı taşları ve tasarım yapısı sağlayan birçok yazılım çerçevesinin geliştirilmesini de kendine çekmiştir. Bunlardan bazıları PRADO, CakePHP, Symfony, CodeIgniter, Laravel, Yii Framework, Phalcon ve Laminas'tır ve diğer web çerçevelerine benzer özellikler sunar.
LAMP mimarisi, web uygulamalarını dağıtma yolu olarak web endüstrisinde popüler oldu.[38] PHP, bu pakette Linux, Apache ve MySQL ile birlikte P olarak çok kullanılır ancak P aynı zamanda Python, Perl veya üçünün bir karışımını da ifade edebilir. Benzer paketler, WAMP ve MAMP, Windows ve macOS için de vardır ve ilk harf ilgili işletim sistemini temsil eder. Hem PHP hem de Apache, macOS temel kurulumunun bir parçası olarak sağlansa da, bu paketlerin kullanıcıları, daha kolay güncel tutulabilecek daha basit bir kurulum mekanizması aramaktadır.
Belirli ve daha gelişmiş kullanım senaryoları için PHP, C veya C++ dilinde özel uzantılar yazmak için iyi tanımlanmış ve belgelenmiş bir yol sunar.[39][40][41][42][43][44][45] Uzantılar, dilin kendisini ek kitaplıklar biçiminde genişletmenin yanı sıra, kritik olduğu durumlarda yürütme hızını artırma yolunu sağlar ve gerçek bir derlenmiş dil kullanarak iyileştirmelere yer vardır.[46][47] PHP ayrıca kendisini diğer yazılım projelerine dahil etmek için iyi tanımlanmış yollar sunar. Bu şekilde PHP, başka bir proje için dahili bir kodlama dili olarak kolayca kullanılabilir ve aynı zamanda projenin belirli dahili veri yapılarıyla sıkı bir arayüz sağlar.[48] PHP, çekirdek dil düzeyinde çoklu iş parçacığı desteğinin bulunmaması nedeniyle karışık eleştiriler aldı, ancak iş parçacıklarını kullanmak "pthreads" PECL uzantısı tarafından mümkün kılındı.[49][50][51]
PHP için bir komut satırı arayüzü, php-cli ve iki ActiveX Windows Komut Dosyası Ana Bilgisayarı komut dosyası oluşturma motoru üretildi.
PHP, MediaWiki,[52] WordPress,[53] Joomla!,[54] Drupal,[55] Moodle,[56] eZ Publish, eZ Platform ve SilverStripe dahil olmak üzere Web içerik yönetim sistemlerinde kullanılır.[57]
Ocak 2013 itibarıyla PHP 240 milyondan fazla web sitesinde kullanılmış (örneklenenlerin %39'u) ve 2,1 milyon web sunucusuna kurulmuştur.[63]
28 Ocak 2024 tarihi itibarıyla (PHP 8.3'ün yayınlanmasından 2 ay sonra), dilin belirlenebildiği web sitelerinin %76,5'inde sunucu tarafı programlama dili olarak PHP kullanılmaktadır; PHP 7, dilin en çok kullanılan sürümüdür; PHP kullanan web sitelerinin %58,8'i bu sürümü kullanırken, %23,9'u PHP 8 ve %17,1'i PHP 5 kullanmaktadır.[58]
2019'da Ulusal Güvenlik Açığı Veritabanı tarafından listelenen tüm güvenlik açıklarının %11'i PHP ile bağlantılıydı.[64] Tarihsel olarak, 1996'dan bu yana bu veri tabanında listelenen tüm güvenlik açıklarının yaklaşık %30'u PHP ile bağlantılıdır. Dilin kendisinin veya çekirdek kitaplıklarının teknik güvenlik kusurları sık görülen bir durum değildir (2009'da 22, toplamın yaklaşık %1'i, ancak PHP listelenen programların yaklaşık %20'si için geçerlidir).[65] Programcıların hata yaptığını kabul eden bazı diller, birçok soruna neden olan girdi doğrulama eksikliğini otomatik olarak tespit etmek için hata kontrolü içerir. Böyle bir özellik PHP için geliştirilmektedir,[66] ancak bunun bir sürüme dahil edilmesi geçmişte birkaç kez reddedilmiştir.[67][68]
Web barındırma ortamları için özel olarak tasarlanmış Suhosin ve Hardening-Patch gibi gelişmiş koruma yamaları bulunmaktadır.[69]
Geçmişte, PHP'nin eski sürümlerinde bazı yapılandırma parametreleri ve bu tür çalışma zamanı ayarları için varsayılan değerler vardı, bu da bazı PHP uygulamalarını güvenlik sorunlarına açık hale getiriyordu. Bunlar arasında magic_quotes_gpc
ve register_globals
[70] yapılandırma direktifleri en iyi bilinenleriydi; ikincisi, herhangi bir URL parametresinin PHP değişkenleri haline gelmesini sağladı ve bir saldırganın herhangi bir başlatılmamış global değişkenin değerini ayarlamasına ve bir PHP betiğinin yürütülmesine müdahale etmesine izin vererek ciddi güvenlik açıklarına yol açtı. "magic quotes" ve "register globals" ayarları desteği PHP 5.3.0'dan beri kullanımdan kaldırılmış ve PHP 5.4.0'dan silinmiştir.[71]
Çalışma zamanı ayarları olası güvenlik açığına başka bir örnek, yüklenen dosyaların depolandığı dizin için PHP yürütmesinin devre dışı bırakılmamasından (örneğin engine
yapılandırma direktifi kullanılarak)[72] kaynaklanır. Bunun etkinleştirilmesi, yüklenen dosyalara yerleştirilmiş kötü amaçlı kodun yürütülmesine neden olabilir.[73][74][75] En iyi uygulama, görüntü dizinini web sunucusunun kullanabileceği belge kökünün dışına yerleştirmek ve onu bir aracı komut dosyası aracılığıyla sunmak veya yüklenen dosyaları saklayan dizin için PHP yürütmesini devre dışı bırakmaktır.
Ayrıca, paylaşılan bir web barındırma ortamında PHP uzantılarının dinamik yüklenmesini etkinleştirmek (enable_dl
yapılandırma yönergesi aracılığıyla)[76] güvenlik sorunlarına yol açabilir.[77][78]
Bazen programcının amacına aykırı olarak farklı değerlerin eşit olarak değerlendirilmesine neden olan ima edilen tip dönüşümleri güvenlik sorunlarına yol açabilir. Örneğin, '0e1234' == '0'
karşılaştırmasının sonucu true
'dur çünkü sayı olarak ayrıştırılabilen dizeler sayılara dönüştürülür. Bu durumda, ilk karşılaştırılan değer sıfır olan (0×101234) değerli bilimsel gösterim olarak kabul edilir. Bunun gibi hatalar MD5 şifre karmaları karşılaştırıldığında Simple Machines Forum,[79] TYPO3[80] ve phpBB[81]'de kimlik doğrulama açıklarına neden oldu. Önerilen yol, hash_equals() (zamanlama saldırısı güvenliği için), strcmp
veya kimlik operatörünü (===
) kullanmaktır çünkü '0e1234' === '0'
false
ile sonuçlanır.[82]
Zone-H tarafından yayınlanan 170.000'den fazla web sitesi tahrifatını kapsayan 2013 analizinde en sık kullanılan teknik (%53), çoğunlukla PHP dil yapılarının include
, require
ve allow_url_fopen
'ın güvensiz kullanımıyla ilgili olan dosya ekleme güvenlik açığından yararlanılmasıydı.[83][84]
23 Aralık 2023 itibarıyla (PHP 8.3 sürümünden 1 ay sonra) W3Techs, PHP kullanan web sitelerinin %85,9'unun 8.0 veya daha eski sürümleri kullandığını (bunlar artık PHP Geliştirme Ekibi tarafından desteklenmemektedir) bildirmektedir.[85]
23 Aralık 2023 itibarıyla Sürüm 5 hâlâ tüm web sitelerinin %13,6'sı tarafından kullanılmaktadır.[60] PHP 8.1 veya sonraki sürümlere geçiş yapılması ve rand()
[86] veya mt_rand()
,[87], yerine random_int()
[88] kullanılması önemle tavsiye edilmektedir çünkü bu işlevler kriptografik açıdan güvensizdir. PHP entropi kaynakları üzerinden gerçekleştirilebilecek iki saldırı vardır: "tohum saldırısı" ve "durum kurtarma saldırısı". Mevcut GPU teknolojileriyle bir saldırgan, 250 ABD doları tutarındaki GPU ile saniyede 230'a kadar MD5 hesaplaması gerçekleştirebilirken, ek 500 ABD doları tutarındaki GPU ile 232'ye kadar hesaplamaya ulaşabilir.[89]
"Doğum günü akını" ile birlikte bu durum ciddi güvenlik açıklarına yol açabilir.
<ref>
etiketi; scalar-types
isimli refler için metin sağlanmadı (Bkz: Kaynak gösterme)PHP is the programming language in which MediaWiki is written
WordPress was built on PHP
SilverStripe requires PHP 5.3.2+