2024. szeptember 6., péntek

13 backend - 6. PHP Szuperglobális Változók

 A PHP szuperglobális változói speciális típusú változók, amelyek előre meghatározottak és globális hatókörrel rendelkeznek. Ez azt jelenti, hogy a PHP-szkript bármely részéből, beleértve a függvényeket, osztályokat és fájlokat, elérhetők.

Miért hasznosak a szuperglobálisok?

  • Globális hatókör: Bárhonnan elérhetők a kódban, így könnyű adatokat továbbítani a különböző részei között.
  • Előre meghatározott értékek: Automatikusan feltöltődnek adatokkal a felhasználói bemenetből, szerverinformációkból vagy HTTP-fejlécekből.
  • Elnevezési konvenció: Mindig egy aláhúzással kezdődnek, pl. $_GET, $_POST, segítve a megkülönböztetést a szokásos változóktól.

6.1 $_GET

A $_GET szuperglobális változó egy asszociatív tömb, amely a böngésző URL-jén keresztül, a HTTP GET módszerrel átadott adatokat tartalmazza. A GET módszert általában olyan kérések esetén használják, amelyek nem módosítanak adatokat a szerveren (pl. adatkeresésnél). Ezek az adatok az URL-ben jelennek meg a kérdőjel (?) után, ahol a kulcs-érték párokat amperszand (&) jel választja el egymástól.

Hogyan működik a $_GET?

Az URL egy adott oldalhoz való hozzáférést biztosít, és gyakran tartalmazhat paramétereket, amelyeket a szerver felhasználhat a válasz személyre szabásához. Például, ha a felhasználó egy űrlapot tölt ki és a GET módszerrel küldi el az adatokat, akkor ezek az adatok az URL részeivé válnak.

Példa URL:
example.com/index.php?name=János&age=25

Ebben az esetben az URL két paramétert tartalmaz:

  • name: ennek az értéke János
  • age: ennek az értéke 25

A PHP $_GET tömbje ezeket a paramétereket automatikusan feldolgozza, és kulcs-érték párokként tárolja. Tehát a fenti példa esetén a $_GET['name'] értéke János, és a $_GET['age'] értéke 25.

Az URL-ből kapott paraméterek használata a $_GET-tel

Amikor a szerver fogad egy GET kérésű URL-t, a PHP a $_GET tömbben tárolja az összes átadott paramétert. Ezeket a paramétereket a szkript bárhonnan elérheti és feldolgozhatja.

// Ellenőrizzük, hogy a GET paraméterek léteznek-e
if (isset($_GET['name']) && isset($_GET['age'])) {
    // Ha igen, kiírjuk a nevét és az életkorát
    echo "Név: " . $_GET['name'] . ", Kor: " . $_GET['age'];
}
  • Az isset() függvény használatával ellenőrizzük, hogy a paraméterek léteznek-e a $_GET tömbben. Ez azért fontos, mert ha egy paraméter nincs megadva az URL-ben, a PHP hibaüzenetet adna, ha közvetlenül próbálnánk meg elérni.
  • Ha a paraméterek léteznek, akkor azokat a $_GET tömbből kiolvassuk, és egyszerűen megjelenítjük a felhasználónak.

Példa URL:
example.com/index.php?name=János&age=25

URL-ből kiolvasott eredmény:

Név: János, Kor: 25

Mire használható a $_GET?

1.     Adatok továbbítása URL-ben: A $_GET segítségével egyszerűen továbbíthatunk adatokat az URL-en keresztül, például keresési lekérdezéseket vagy szűrési paramétereket. Ezek az adatok felhasználhatók a szerveroldalon a keresési eredmények vagy a tartalom szűréséhez.

    • Példa: example.com/search.php?q=php+tutorials keresési lekérdezés küldése.

2.     Oldalak személyre szabása: A $_GET tömb felhasználható arra, hogy különböző paraméterek alapján módosítsuk a weboldal tartalmát. Például egy webshopban a felhasználó kiválaszthat egy kategóriát, és a GET paraméterek alapján csak az adott kategória termékeit jelenítjük meg.

    • Példa: example.com/shop.php?category=electronics

3.     Kis méretű adatok továbbítása: A GET módszer korlátozott mennyiségű adatot képes továbbítani (általában néhány ezer karakter), így ideális kis méretű adatok, például űrlapadatok vagy linkek továbbítására.

Fontos megjegyzések:

1.     Biztonság:

    • A GET módszerrel küldött adatok az URL-ben jelennek meg, így láthatók a böngésző címsorában és elmenthetők a böngésző előzményeibe. Emiatt érzékeny adatokat (például jelszavakat vagy banki adatokat) soha nem szabad GET-tel továbbítani.
    • A felhasználó az URL-ben lévő adatokat manipulálhatja. Ezért mindig ellenőrizni és szűrni kell a GET paramétereket, hogy elkerüljük a biztonsági problémákat, például az SQL injekciót vagy a XSS (cross-site scripting) támadásokat.

Példa szűrésre:

$name = htmlspecialchars($_GET['name']);  // Speciális karakterek átalakítása

2.     GET vs POST: A GET módszert főként olyan kérésekhez használjuk, amelyek nem változtatják meg az adatokat a szerveren, például keresési vagy szűrési kérésekhez. A POST módszert akkor használjuk, ha a felhasználó adatokat küld be (pl. űrlapok), és ezek az adatok nagyobbak, vagy érzékenyebbek.

3.     Adatmennyiség korlátozása: A GET módszerrel küldött adatok mérete általában korlátozott (a böngésző és a szerver beállításaitól függően), míg a POST módszerrel nagyobb mennyiségű adat is továbbítható.

A $_GET szuperglobális változó egy rendkívül hasznos eszköz, amely lehetővé teszi a fejlesztők számára, hogy az URL-ből könnyedén hozzáférjenek a felhasználói adatokhoz. Ez különösen hasznos keresések, szűrések és egyéb egyszerű adatok továbbítására a böngészőből a szerverre. Azonban mindig figyelni kell a biztonsági szempontokra, és megfelelően szűrni kell a beérkező adatokat.

6.2 $_POST

A $_POST szuperglobális változó egy asszociatív tömb, amely a HTTP POST módszerrel küldött adatokat tartalmazza. A POST módszer az egyik leggyakoribb módja annak, hogy az űrlapok adatait a szerverre továbbítsuk, különösen olyan esetekben, amikor nagyobb mennyiségű adatot (pl. szöveges mezők, fájlok) vagy érzékeny információkat (pl. jelszavakat) kell küldeni. A $_POST adatokat nem jelenítik meg az URL-ben, ami biztonságosabbá teszi bizonyos típusú adatküldések esetén.

Hogyan működik a $_POST?

Amikor egy felhasználó egy HTML formot kitölt és elküldi, a böngésző az űrlap adatait a szerverre küldi egy HTTP kérésben. Ha az űrlap POST módszerrel van elküldve, az adatokat nem látjuk az URL-ben, hanem a kérés testében kerülnek továbbításra. A PHP a szerveren automatikusan feldolgozza ezt a kérést, és az adatokat a $_POST szuperglobális tömbben tárolja.

Példakód:

Egy egyszerű HTML űrlap, amely POST módszerrel küldi el az adatokat a szerverre:

<form method="POST" action="submit.php">
    <input type="text" name="name" placeholder="Név">
    <input type="submit" value="Küldés">
</form>
  • method="POST": Ez meghatározza, hogy a form adatait a POST módszerrel küldjük el.
  • action="submit.php": Az űrlap adatainak céloldala, amely a form feldolgozásáért felelős.

PHP rész:

// submit.php fájl
if (isset($_POST['name'])) {
    echo "Küldött név: " . $_POST['name'];
}
  • Az isset() függvényt használjuk annak ellenőrzésére, hogy a felhasználó ténylegesen küldött-e adatot az űrlapról. Ha igen, az adat a $_POST['name'] tömbben található, és kiírjuk a megadott nevet.

Példa működés:

Tegyük fel, hogy a felhasználó az űrlapon a következő adatokat adja meg:

  • Név: Péter

Miután a felhasználó rákattint a „Küldés” gombra, a böngésző elküldi az adatokat a szerverre POST kéréssel. A submit.php feldolgozza az adatokat, és a következő eredményt adja:

Küldött név: Péter

A POST módszer előnyei

1.     Adatvédelem: Mivel a POST módszerrel küldött adatok nem jelennek meg az URL-ben, biztonságosabb, különösen érzékeny információk, mint például jelszavak vagy személyes adatok továbbításakor.

2.     Nagyobb adatmennyiség: A POST módszer lehetővé teszi, hogy nagyobb mennyiségű adatot küldjünk a szerverre, míg a GET módszernél van egy korlátozás az URL maximális hosszára (böngésző és szerver korlátok miatt).

3.     Bonyolultabb űrlapok kezelése: A POST módszer különösen hasznos összetettebb űrlapok esetében, amelyek fájlokat, több soros szöveget vagy más bonyolult struktúrákat tartalmaznak.

Mire használható a $_POST?

1.     Űrlapadatok továbbítása: A $_POST használható egyszerű űrlapok adatainak továbbítására, például felhasználói regisztrációs űrlapokra, bejelentkezési oldalakra, vagy kapcsolatfelvételi űrlapokra.

2.     Fájlok feltöltése: A $_POST módszerrel könnyen kezelhetjük a fájlokat is, amikor egy űrlapon keresztül fájlokat töltenek fel. Ehhez kombinálhatjuk a $_FILES szuperglobális változóval.

3.     Jelszavak és érzékeny adatok kezelése: A POST módszer sokkal biztonságosabb az olyan űrlapokhoz, amelyek érzékeny adatokat kérnek, mivel ezek nem lesznek láthatók az URL-ben.

Példakód jelszavak küldésére:

<form method="POST" action="login.php">
    <input type="text" name="username" placeholder="Felhasználónév">
    <input type="password" name="password" placeholder="Jelszó">
    <input type="submit" value="Bejelentkezés">
</form>

A fent említett űrlap a felhasználónevet és a jelszót POST módszerrel küldi el a szerverre, anélkül, hogy ezek megjelennének az URL-ben.

Fontos megjegyzések:

1.     Biztonság:

    • Bár a POST módszer biztonságosabb a GET-nél, nem jelent önmagában teljes védelmet. Mindig használni kell biztonsági intézkedéseket, például HTTPS-t az adatok titkosított továbbításához, és érvényesíteni kell az adatokat a szerver oldalon is.

Példa érvényesítésre:

$name = htmlspecialchars($_POST['name']);  // HTML karakterek átalakítása

2.     Nagy mennyiségű adat kezelés: A POST módszerrel nagy mennyiségű adatot küldhetünk, például hosszabb szöveges adatokat vagy több mezővel rendelkező űrlapokat.

3.     Hozzáférés szűrés: A POST módszer használatával küldött adatok mindig a $_POST szuperglobálison keresztül érhetők el, függetlenül attól, hogy hány oldal van érintve. Ez azt jelenti, hogy minden egyes oldal, amelyhez hozzáférünk, hozzáférhet az űrlap által küldött adatokhoz is.

GET vs POST összehasonlítás:

·        GET:

    • Az adatok az URL-ben jelennek meg.
    • Korlátozott mennyiségű adat küldhető (általában néhány ezer karakter).
    • Nem alkalmas érzékeny adatok továbbítására.
    • Általában adatlekérdezésre vagy oldalfrissítésekre használják.

·        POST:

    • Az adatok a kérés testében vannak, nem láthatók az URL-ben.
    • Nagyobb mennyiségű adat küldhető.
    • Alkalmas érzékeny adatok küldésére (pl. jelszavak).
    • Általában adatbeküldésre és fájlok feltöltésére használják.

A $_POST szuperglobális változó hatékony és biztonságos módszer a felhasználói adatok szerverre történő továbbítására. Ez a módszer különösen hasznos olyan helyzetekben, amikor érzékeny adatokat kell továbbítani, vagy nagyobb mennyiségű adatot kell feldolgozni. A POST módszer segítségével könnyedén elérhetők és feldolgozhatók a felhasználói adatok, miközben az adatok védelmét is biztosítja.

6.3 $_SESSION

A $_SESSION szuperglobális lehetővé teszi a munkamenetek kezelését a PHP-ban. Ez különösen hasznos, ha több oldalkérésen keresztül szeretnénk megőrizni a felhasználói adatokat. A munkamenet (session) egy szerveroldalon tárolt adat, amely egyedi felhasználókhoz van kötve. Minden felhasználó saját munkamenet-azonosítót (session ID) kap, amely alapján a szerver nyomon tudja követni a felhasználót, még akkor is, ha az átlép egyik oldalról a másikra.

Hogyan működik a munkamenet?

1.     Munkamenet indítása: A PHP-ban a munkamenet-kezelést a session_start() függvénnyel indítjuk. Ennek hatására a szerver létrehozza vagy folytatja az adott felhasználóhoz tartozó munkamenetet, ami a felhasználó böngészőjében egyedileg azonosítva van egy session ID nevű cookie segítségével.

2.     Adatok tárolása: Miután a munkamenet elindult, a $_SESSION szuperglobális tömbön keresztül bármilyen adatot tárolhatunk a szerveren, amely a felhasználóra vonatkozik. Az adatokat ezután több oldalkérés során is elérhetjük.

3.     Adatok elérése: A felhasználóra vonatkozó adatokat bármelyik oldalról elérhetjük, ahol a session_start() függvény hívva van.

4.     Munkamenet befejezése: Ha már nincs szükség a munkamenetre, vagy a felhasználó kijelentkezik, a munkamenet megszüntethető a session_destroy() függvénnyel. Ez törli a szerveren tárolt adatokat és érvényteleníti a felhasználó session ID-jét.

Részletes példa a munkamenet használatára:

1. Oldal: Munkamenet indítása és adat tárolása; pl: belépés egy oldalra

// Munkamenet indítása
session_start();
 
// Adat tárolása a munkamenetben
$_SESSION['user'] = "Lucifer";
 
// Az adat elérése
echo "Üdvözöllek, " . $_SESSION['user'];
  • A session_start() elindítja a munkamenetet.
  • A $_SESSION['user'] változóban tároljuk a felhasználó nevét, amelyet most "Lucifer"-nek állítunk be.
  • Ez az adat elérhető minden későbbi oldalon, amely ugyanennek a munkamenetnek a része.

2. Oldal: Munkamenet adatainak elérése; a személyes adatok elérése

session_start();
 
// Ellenőrzés, hogy van-e munkamenet adat
if (isset($_SESSION['user'])) {
    echo "Üdv újra, " . $_SESSION['user'];
} else {
    echo "Nincs bejelentkezett felhasználó.";
}
  • A session_start() függvény folytatja a már meglévő munkamenetet, így elérhetjük a korábban tárolt adatokat.
  • A $_SESSION['user'] változóban elérjük a felhasználó nevét, amit korábban "János"-nak állítottunk be.

3. Oldal: Munkamenet törlése -> kijelentkezés

// Munkamenet indítása
session_start();
 
// Munkamenet adatainak törlése
session_unset();  // Törli a $_SESSION tömb összes elemét
 
// Munkamenet megszüntetése
session_destroy();  // A munkamenet teljes megszüntetése
  • A session_unset() törli a munkamenetben tárolt összes adatot.
  • A session_destroy() teljesen megszünteti a munkamenetet, ami azt jelenti, hogy a felhasználó session ID-je érvénytelen lesz, és a következő kéréskor új munkamenetet kell indítani.

Munkamenetek előnyei:

  • Állapot megtartása: Lehetővé teszi, hogy az alkalmazás "emlékezzen" a felhasználóról több kéréssel kapcsolatban.
  • Biztonság: A munkamenet-adatok szerveroldalon vannak tárolva, így kevésbé érzékenyek a kliensoldali manipulációkra, mint például a cookie-k.
  • Egyszerű használat: Könnyű implementálni és felhasználni bármilyen PHP projektben.

Fontos tudnivalók:

  • session_start(): Ezt minden olyan oldal tetején meg kell hívni, ahol a munkamenet adatokat használni szeretnénk.
  • session ID: A munkamenet azonosításához szükséges az egyedi session ID, amit a PHP automatikusan kezel.
  • Biztonság: Fontos a munkamenetek biztonságos kezelése, például titkosított kapcsolat (HTTPS) használatával, hogy elkerüljük a session hijacking-et (munkamenet eltérítését).

Ez az eljárás biztosítja, hogy a felhasználó által megadott információk több oldal kérésén keresztül megőrződjenek, például bejelentkezéskor vagy kosár funkció esetén.

6.4 $_COOKIE

A $_COOKIE szuperglobális a sütik segítségével tárolt adatokat tartalmazza.

// Süti beállítása
setcookie("username", "János", time() + (86400 * 30), "/");  // 30 napig érvényes
 
// Süti elérése
if (isset($_COOKIE['username'])) {
    echo "Süti tartalma: " . $_COOKIE['username'];
}

Mi az a süti?

A süti (cookie) egy kis adatcsomag, amelyet a webkiszolgáló (szerver) küld a felhasználó böngészőjébe, és amelyet a böngésző minden későbbi kéréskor visszaküld a szervernek. A sütik általában olyan információkat tárolnak, mint például a felhasználó bejelentkezési állapota, nyelvi preferenciák vagy egyéb beállítások.

Sütik beállítása

A setcookie() függvénnyel állíthatunk be sütiket. A függvény szintaxisa a következő:

setcookie(name, value, expire, path, domain, secure, httponly);
  • name: A süti neve.
  • value: A süti értéke.
  • expire: Az időpont, ameddig a süti érvényes lesz, UNIX időbélyeg formájában. (pl. time() + (86400 * 30) - 30 nap múlva)
  • path: A weboldal azon útvonala, amelyhez a süti érvényes. Ha "/"-ot adunk meg, akkor az egész weboldalon érvényes lesz.
  • domain: Az a domain, amelyhez a süti érvényes.
  • secure: Ha true, akkor a süti csak HTTPS kapcsolaton keresztül lesz elküldve.
  • httponly: Ha true, akkor a süti csak HTTP kéréseken keresztül érhető el, nem JavaScriptből.

Példa sütik beállítására:

setcookie("username", "János", time() + (86400 * 30), "/");  // 30 napig érvényes

Ebben a példában a süti neve username, értéke János, és 30 napig lesz érvényes, az egész weboldalon elérhető.

Sütik elérése

A $_COOKIE szuperglobális tömb tartalmazza az összes sütit, amelyet a böngésző visszaküldött a szervernek. Az egyes sütik értékei a tömb kulcsai alapján érhetők el.

Példa sütik elérésére:

if (isset($_COOKIE['username'])) {
    echo "Süti tartalma: " . $_COOKIE['username'];
} else {
    echo "A süti nem létezik.";
}

Ebben a példában ellenőrizzük, hogy a username nevű süti létezik-e, és ha igen, kiírjuk annak értékét. Ha nem létezik, akkor egy üzenetet adunk vissza.

Fontos tudnivalók

1.     Sütik és biztonság: A sütik nem titkosítva tárolják az adatokat, ezért érzékeny információk tárolására nem javasoltak. Ha érzékeny adatokat kell tárolni, használjunk HTTPS-t, és lehetőség szerint titkosítsuk az adatokat.

2.     Sütik élettartama: A sütik élettartamát az expire paraméter határozza meg. Ha nem állítunk be expire időpontot, a süti csak a böngésző munkamenete alatt lesz elérhető.

3.     Sütik és adatvédelem: A sütik használata adatvédelmi kérdéseket vethet fel, ezért fontos, hogy a felhasználókat tájékoztassuk arról, hogy sütiket használunk, és biztosítsuk, hogy megfeleljünk a vonatkozó adatvédelmi törvényeknek (pl. GDPR).

6.5 $_REQUEST

A $_REQUEST változó egy speciális szuperglobális tömb a PHP-ban, amely lehetővé teszi, hogy a felhasználói bemenetet egyetlen helyről érjük el, függetlenül attól, hogy az adatokat GET, POST vagy COOKIE módszerrel küldték. Ez a tulajdonság kényelmes lehet az adatok lekérésekor, de bizonyos biztonsági kockázatokat is hordoz, mivel nem különbözteti meg az adatforrásokat.

Hogyan működik a $_REQUEST?

A PHP automatikusan feltölti a $_REQUEST tömböt az alábbi adatokkal:

  • $_GET: Az URL-ben lévő paraméterekkel érkező adatokat tartalmazza.
  • $_POST: A HTTP POST módszerrel küldött adatokat tartalmazza (például űrlapok adatai).
  • $_COOKIE: A felhasználói böngészőben tárolt sütiket tartalmazza, amelyeket a szerver felé továbbítanak.

A $_REQUEST egy kombinált tömb, ami azt jelenti, hogy ezek az adatok egyesítve vannak egyetlen tömbben, és a tömb kulcsai a változók nevei (mint $_GET, $_POST vagy $_COOKIE esetében).

Előnyei:

  1. Egyszerűsített hozzáférés: Nem kell külön ellenőrizni, hogy az adat GET, POST vagy COOKIE módszerrel érkezett. A $_REQUEST segítségével egyetlen helyről elérhetők.
  2. Rugalmasság: Ha az adat forrása nem fontos, és csak a változó létezése érdekel, a $_REQUEST egyszerűbbé teszi az adatok kezelését.

Hátrányai:

  1. Biztonsági kockázat: Mivel a $_REQUEST nem különbözteti meg az adatforrásokat, nehéz lehet biztosítani, hogy egy adat megbízható forrásból származik-e. Például egy $_POST változó könnyen felülírható egy $_GET vagy $_COOKIE változóval. Ezért a biztonságos és pontos adatkezelés érdekében inkább konkrétan a $_GET, $_POST, vagy $_COOKIE szuperglobálisokat érdemes használni.
  2. Nem specifikus: A $_REQUEST nem jelzi, hogy az adat melyik módszerrel érkezett, ezért elveszhet az az információ, hogy egy adatot GET, POST vagy COOKIE módszerrel kaptunk-e meg. Ez zavaró lehet egyes esetekben, például ha POST és GET változók azonos nevűek.

Példa a $_REQUEST használatára:

Adatküldés GET vagy POST módszerrel:

// Ha egy űrlap GET vagy POST módszerrel küldi az adatokat, mindkettőt elérhetjük $_REQUEST segítségével:
if (isset($_REQUEST['name'])) {
    echo "Név: " . $_REQUEST['name'];
}

GET módszer esetén:

// URL: example.com/page.php?name=János
// Eredmény: Név: János

POST módszer esetén:

<form method="POST" action="page.php">
    <input type="text" name="name" value="Péter">
    <input type="submit" value="Küldés">
</form>
 
// POST kérés után: Név: Péter

COOKIE használata:

// Beállítunk egy cookie-t:
setcookie("name", "Kata", time() + 3600); // 1 órán át érvényes
 
// $_REQUEST segítségével elérhetjük a cookie-t:
if (isset($_REQUEST['name'])) {
    echo "Név: " . $_REQUEST['name'];
}

Ebben az esetben a $_REQUEST['name'] tartalmazhatja a sütit is, ha létezik.

$_REQUEST használatának kockázatai:

Egy egyszerű példával bemutatom, miért kevésbé biztonságos a $_REQUEST használata:

Probléma: GET és POST ütközés Ha ugyanazt a kulcsot használjuk GET és POST változókban, a $_REQUEST a két forrásból érkező adatokat összemossa, és előnyben részesítheti az egyiket (általában a GET-et).

Példa:

// URL: example.com/page.php?name=Éva
<form method="POST" action="page.php">
    <input type="text" name="name" value="Kata">
    <input type="submit" value="Küldés">
</form>
 
if (isset($_REQUEST['name'])) {
    echo "Név: " . $_REQUEST['name'];
}

Ha egy felhasználó POST módszerrel küldi az adatot ("Kata"), de a GET kérés tartalmaz egy "name" paramétert is ("Éva"), akkor a $_REQUEST['name'] valószínűleg az URL-ben lévő GET paramétert fogja visszaadni ("Éva"), és nem a POST kéréssel küldött adatot ("Kata"). Ez biztonsági kockázatot jelenthet, például amikor érzékeny adatokat POST módszerrel továbbítunk.

Mikor érdemes használni a $_REQUEST-t?

  • Ha az adat forrása nem lényeges, és egyszerűen csak el akarjuk érni a változót, függetlenül attól, hogy GET, POST vagy COOKIE módszerrel érkezett.
  • Ha gyors prototípust készítünk, és a biztonság nem elsődleges szempont.

Mikor ne használjuk a $_REQUEST-t?

  • Ha a biztonság kritikus, például érzékeny adatokat továbbítunk (pl. felhasználói bejelentkezés, jelszó). Ilyen esetben a $_POST használata javasolt.
  • Ha pontosan tudni akarjuk, hogy az adat GET vagy POST módszerrel érkezett.

Összefoglalás:

  • $_REQUEST: Kényelmes módja az adatok elérésének, ha nem számít, hogy GET, POST vagy COOKIE módszerrel érkeztek.
  • Használata biztonsági kockázatot rejthet: Ügyeljünk arra, hogy a $_REQUEST nem különbözteti meg az adatforrásokat, így könnyen ütközhetnek a változók.
  • Biztonságosabb alternatívák: Ha fontos, hogy az adat milyen módszerrel érkezett, inkább használjuk a konkrét szuperglobális változókat: $_GET, $_POST, vagy $_COOKIE.

A $_REQUEST tehát kényelmes, de fokozott figyelmet igényel a biztonságos használat érdekében.

6.6 $_FILES

A $_FILES szuperglobális segítségével a PHP képes kezelni a HTTP POST kéréseken keresztül érkező fájlokat. Ezt általában űrlapokban használják, amikor a felhasználóknak lehetőségük van fájlokat feltölteni a szerverre. A $_FILES egy tömb, amely tartalmazza a feltöltött fájlokkal kapcsolatos információkat, például a fájl nevét, típusát, méretét és az ideiglenes helyét, ahova a szerver elmenti a fájlt a feldolgozás előtt.

Hogyan működik a fájlfeltöltés a PHP-ban?

HTML űrlap létrehozása fájl feltöltéséhez

Az űrlapban használnunk kell a enctype="multipart/form-data" attribútumot, hogy a fájlokat megfelelően továbbítsuk a szervernek. Ez az attribútum lehetővé teszi, hogy a böngésző többféle adatot is küldjön, például szöveget és fájlokat egyaránt.

Példa űrlap:

html
Kód másolása
<form method="POST" action="upload.php" enctype="multipart/form-data">
    <input type="file" name="fileToUpload">
    <input type="submit" value="Feltöltés">
</form>
  • Az űrlap egy fileToUpload nevű input mezőt tartalmaz, amely lehetővé teszi a felhasználó számára, hogy fájlt válasszon ki a feltöltéshez.
  • Az enctype="multipart/form-data" fontos, mert enélkül a fájl nem kerülne megfelelően továbbításra a szervernek.

A feltöltött fájl feldolgozása a szerveren

Amikor a felhasználó rákattint az "Feltöltés" gombra, a PHP a $_FILES tömbbe tölti a fájllal kapcsolatos adatokat.

Az alábbi $_FILES tömb tartalmazza a következő kulcsokat minden fájlhoz:

  • name: A feltöltött fájl eredeti neve.
  • type: A fájl MIME típusa (pl. image/jpeg, application/pdf).
  • tmp_name: Az ideiglenes hely, ahol a fájl tárolva van a szerveren, amíg fel nem dolgozzuk.
  • error: Hibakód, amely jelzi, hogy történt-e hiba a feltöltés során.
  • size: A fájl mérete bájtokban.

PHP kód a fájl feltöltéséhez:

// Ellenőrizzük, hogy történt-e fájlfeltöltés
if (isset($_FILES['fileToUpload'])) {
    // A feltöltött fájl neve
    $fileName = $_FILES['fileToUpload']['name'];
    
    // A fájl ideiglenes helye a szerveren
    $fileTmpName = $_FILES['fileToUpload']['tmp_name'];
    
    // A fájl áthelyezése a cél könyvtárba
    if (move_uploaded_file($fileTmpName, "uploads/" . $fileName)) {
        echo "A fájl sikeresen feltöltve: " . $fileName;
    } else {
        echo "Hiba történt a fájl feltöltése során.";
    }
}

Részletezve a feltöltési folyamatot:

1.     $_FILES['fileToUpload']['name']: A feltöltött fájl eredeti neve, amelyet a felhasználó a fájlkiválasztó mezőn keresztül tölt fel. Például: kep.jpg.

2.     $_FILES['fileToUpload']['tmp_name']: Ez az ideiglenes hely, ahol a fájl tárolva van a szerveren, amíg fel nem dolgozzuk. Ez egy átmeneti fájl, amit a PHP automatikusan létrehoz.

3.     move_uploaded_file() függvény: Ez a funkció áthelyezi a fájlt az ideiglenes helyről egy állandó helyre a szerveren. Például a uploads/ könyvtárba helyezhetjük át. Fontos, hogy a cél könyvtár létezzen, és a szervernek megfelelő írási jogai legyenek a fájl elmentéséhez.

4.     Hibaellenőrzés: A feltöltés során előfordulhatnak hibák, amelyeket a $_FILES['fileToUpload']['error'] változó tartalmaz. Ennek segítségével ellenőrizhetjük, hogy történt-e probléma.

Hibakódok és kezelésük:

A $_FILES['fileToUpload']['error'] egy hibakódot tartalmaz, amely jelzi, hogy mi történt a fájl feltöltése során. A leggyakoribb hibakódok:

  • UPLOAD_ERR_OK (0): A fájl sikeresen feltöltődött.
  • UPLOAD_ERR_INI_SIZE (1): A fájl mérete meghaladja a upload_max_filesize irányelvben meghatározott méretet a php.ini fájlban.
  • UPLOAD_ERR_FORM_SIZE (2): A fájl mérete meghaladja az űrlapon beállított maximális méretet (MAX_FILE_SIZE irányelv).
  • UPLOAD_ERR_PARTIAL (3): A fájl csak részben lett feltöltve.
  • UPLOAD_ERR_NO_FILE (4): Nem töltöttek fel fájlt.

Például egy egyszerű hibakezelés így nézhet ki:

if ($_FILES['fileToUpload']['error'] === UPLOAD_ERR_OK) {
    // Fájl sikeresen feltöltve
} else {
    // Hiba történt
    echo "Hiba történt: " . $_FILES['fileToUpload']['error'];
}

A fájlok méretének korlátozása

A PHP beállításaiban korlátozhatjuk a feltöltött fájl maximális méretét a php.ini fájlban a következő irányelvek segítségével:

  • upload_max_filesize: A feltöltött fájlok maximális mérete.
  • post_max_size: A POST adatok maximális mérete (beleértve a fájlokat).

Például:

ini fájlban:
upload_max_filesize = 2M
post_max_size = 8M
 

Biztonsági megfontolások fájlfeltöltésnél:

1.     Fájl típusa és kiterjesztése ellenőrzése: Mielőtt elfogadnánk a fájlokat, mindig ellenőrizzük a fájl típusát és kiterjesztését. Ezt megtehetjük a $_FILES['fileToUpload']['type'] vagy a pathinfo() függvény segítségével.

Például csak képfájlokat engedélyezhetünk:

$fileType = mime_content_type($_FILES['fileToUpload']['tmp_name']);
if ($fileType != "image/jpeg" && $fileType != "image/png") {
    echo "Csak JPEG és PNG fájlokat tölthet fel!";
    exit();
}

2.     Fájlnevek kezelése: Ügyelni kell arra, hogy a fájl neve ne tartalmazzon veszélyes karaktereket (pl. speciális karakterek vagy útvonalak). Használhatjuk a basename() függvényt a fájl nevének biztonságos kezelésére.

$fileName = basename($_FILES['fileToUpload']['name']);

3.     Az ideiglenes fájl eltávolítása: Ha nem helyezzük át a feltöltött fájlt, az ideiglenes fájl automatikusan törlődik a szkript futásának végén. Azonban ha valamilyen hiba történik, manuálisan is törölhetjük az ideiglenes fájlt a unlink() függvénnyel.

A $_FILES szuperglobális egy hatékony eszköz a PHP-ban a fájlok kezelésére. Lehetővé teszi, hogy a felhasználók fájlokat töltsenek fel a szerverre, és ezeket az adatokat könnyen kezelhessük, feldolgozhassuk és áthelyezhessük a kívánt helyre. A fájlfeltöltés során azonban különös figyelmet kell fordítani a biztonsági megfontolásokra, például a fájl típusának és méretének ellenőrzésére.

6.7 $_SERVER

A $_SERVER szuperglobális változó számos olyan információt tartalmaz, amelyek a szerverrel, az aktuális kéréssel és a környezeti változókkal kapcsolatosak. Ez egy asszociatív tömb, amely hozzáférést biztosít a szerver által feldolgozott HTTP kérés részleteihez. Ezek az információk hasznosak lehetnek például a kérési metódusok megértéséhez, a felhasználó által látogatott oldal meghatározásához, vagy a kiszolgáló környezetének lekérdezéséhez.

A $_SERVER tömb kulcsai és gyakran használt elemei:

1. $_SERVER['REQUEST_METHOD']:

Ez a kulcs megadja, hogy milyen módszerrel érkezett a kérés a szerverhez, például GET, POST, PUT, vagy DELETE. Általában a GET és POST a leggyakrabban használt HTTP módszerek a webalkalmazásokban.

echo "A kérés módszere: " . $_SERVER['REQUEST_METHOD'];
  • Ha a kérés GET módszerrel érkezett, akkor az eredmény: A kérés módszere: GET
  • Ha a kérés POST módszerrel érkezett, akkor az eredmény: A kérés módszere: POST

2. $_SERVER['SERVER_NAME']:

Ez a kulcs megadja a szerver nevét, amely az aktuális szkriptet futtatja. Ez általában a domain nevet jelenti, például example.com.

echo "A szerver neve: " . $_SERVER['SERVER_NAME'];
  • Eredményként a szerver neve jelenik meg, például: A szerver neve: example.com.

3. $_SERVER['SCRIPT_NAME']:

Ez a kulcs megadja a futtatott PHP szkript elérési útját a szerveren. Ez különösen hasznos lehet, ha dinamikusan szeretnénk meghatározni a jelenlegi szkript helyét vagy URL-jét.

echo "A szkript neve: " . $_SERVER['SCRIPT_NAME'];
  • Eredmény: A szkript neve: /folder/file.php, ami az aktuális szkript elérési útját jelzi.

4. $_SERVER['REMOTE_ADDR']:

Ez a kulcs a kliens (felhasználó) IP-címét adja meg, amely kapcsolatba lépett a szerverrel. Ez hasznos lehet például a felhasználói tevékenységek nyomon követéséhez vagy biztonsági ellenőrzésekhez.

echo "A felhasználó IP címe: " . $_SERVER['REMOTE_ADDR'];
  • Eredmény: A felhasználó IP címe: 192.168.1.1, vagy más IP-cím, amely a felhasználót azonosítja.

5. $_SERVER['HTTP_USER_AGENT']:

Ez a kulcs a felhasználó böngészőjéről és eszközéről tartalmaz információkat. Az HTTP_USER_AGENT általában egy hosszú karakterlánc, amely leírja a felhasználó által használt böngészőt, az operációs rendszert, és egyéb releváns adatokat.

echo "A böngésző adatai: " . $_SERVER['HTTP_USER_AGENT'];
  • Eredmény: A böngésző adatai: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36
  • Ez az adat segítséget nyújt abban, hogy megértsük, milyen böngészőt és operációs rendszert használ a felhasználó.

6. $_SERVER['SERVER_PORT']:

Ez a kulcs azt a portot adja meg, amelyen a szerver a kérést fogadta. Például a legtöbb webhely alapértelmezett portja a 80-as (HTTP) vagy a 443-as (HTTPS).

echo "A szerver portja: " . $_SERVER['SERVER_PORT'];
  • Eredmény: A szerver portja: 80, ha a kérés HTTP-n keresztül érkezik, vagy A szerver portja: 443, ha HTTPS-en keresztül.

7. $_SERVER['REQUEST_URI']:

Ez a kulcs a teljes URI-t tartalmazza, amelyet a felhasználó kért. Ez magában foglalja az útvonalat és az esetleges kérés paramétereit is. Ez hasznos lehet, ha dinamikusan szeretnénk dolgozni az URL-ben található adatokkal.

echo "A kérés URI-je: " . $_SERVER['REQUEST_URI'];
  • Eredmény: A kérés URI-je: /products?category=books&item=123, amely a kért oldal teljes URI-ját jelzi.

8. $_SERVER['HTTP_REFERER']:

Ez a kulcs megadja annak az oldalnak az URL-jét, amelyről a felhasználó érkezett az aktuális oldalra. Ez a referer URL hasznos lehet statisztikák gyűjtésére vagy átirányítások kezelésére.

echo "Honnan érkezett a felhasználó: " . $_SERVER['HTTP_REFERER'];
  • Eredmény: Honnan érkezett a felhasználó: https://example.com/previous-page, ami az előző oldal URL-jét jelzi.

Biztonsági megfontolások:

  • Adatvalidálás: Bár a $_SERVER szuperglobális számos hasznos adatot szolgáltat, mindig ellenőrizni és validálni kell az adatokat, különösen, ha külső forrásokból (pl. HTTP_USER_AGENT, HTTP_REFERER) származnak. Ezeket az információkat a felhasználók manipulálhatják, ezért fontos, hogy ne bízzunk meg bennük vakon.
  • IP-címek és user agent: Az IP-címek és a böngészők adatai hasznosak lehetnek, de nem mindig megbízhatóak, mivel proxyk és VPN-ek használatával a felhasználók elrejthetik valódi IP-jüket vagy megváltoztathatják a böngészőjük azonosítóját.

A $_SERVER szuperglobális sokféle információt tartalmaz a szerverről és az aktuális kérésről, így fontos eszköz a szerver állapotának és a felhasználók tevékenységeinek megfigyelésére. A kérés módszere, a szerver neve, a szkript útvonala, a felhasználói IP-cím és a böngésző adatai mind könnyen hozzáférhetők a $_SERVER változóval, de fontos figyelembe venni a biztonsági szempontokat és az adatok megfelelő validálását.

Összefoglalás

  • $_GET: URL-paraméterek kezelésére.
  • $_POST: Űrlapok POST metódusával küldött adatok kezelésére.
  • $_SESSION: Munkamenet alapú adatokat tárol több oldalon keresztül.
  • $_COOKIE: Kliens oldalon tárolt sütik kezelésére.
  • $_REQUEST: GET, POST, és COOKIE adatok egyesített elérésére.
  • $_FILES: Feltöltött fájlok kezelésére.
  • $_SERVER: Szerver és kérés információinak lekérésére.

A PHP szuperglobálisai hatékony eszközök a webes alkalmazásokban az adatok kezelésére és továbbítására.

Nincsenek megjegyzések:

Megjegyzés küldése

Norvég feladat

A feladathoz szükséges képek, minta és adatbázis elérhetősége: https://github.com/latiza/norv-gfeladat/