Biztonságos linkek 1.
Ebben a cikkben bemutatom, hogyan lehet két oldalt egymáshoz linkelni, és hogyan lehet biztonságosan adatokat átadni egy másik oldalnak.
Bár a mai témánk egyszerűnek ígérkezik, mégis ahhoz, hogy elmagyarázzam, több területet is érintenünk kell.
Először is szükségünk lesz két weboldalra. Az egyszerűség kedvéért legyen a nevük "oldal1.php" és "oldal2.php".
oldal1.php:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Oldal 1</title>
</head>
<body>
</body>
</html>
oldal2.php:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Oldal 2</title>
</head>
<body>
</body>
</html>
Most pedig létrehozunk egy linket, ami az első oldalról a másodikra mutat:
oldal1.php:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Oldal 1</title>
</head>
<body>
<a href="oldal2.php">Oldal 2</a>
</body>
</html>
A képernyőn megjelenik az "Oldal 2" felirat, és ha erre kattintunk, akkor átkerülünk az oldal2-re.
Ez eddig egyszerű, semmi trükk nincs benne. Az izgalmas rész most következik.
Azért, hogy ne kelljen mindig az egész oldalt bemásolni, mostantól csak a <body> részt fogom mutatni.
Arra keressük a választ, hogyan tudunk egyik oldalról a másikra adatokat továbbítani. A probléma abból adódik, hogy ha az első weblapon létrehozunk egy változót, azt a második nem látja, ott nem tudjuk használni. Ennek a problémának a megoldására többféle módszer is kínálkozik, most a legegyszerűbbet elemezzük, azaz, adatokat fogunk átadni linkek segítségével.
Kezdjük azzal, hogy létrehozunk két változót, majd megnézzük mi történik velük, ha simán átlépünk a második oldalra:
oldal1.php:
<?php
$valtozo1 = "Teszt";
$valtozo2 = "SimplePHP";
?>
<a href="oldal2.php">Oldal 2</a>
oldal2.php:
<?php
if (isset($valtozo1)) {
echo $valtozo1;
} else {
echo '$valtozo1 nem létezik!';
}
echo "<br />"; // Sortörés
if (isset($valtozo2)) {
echo $valtozo2;
} else {
echo '$valtozo2 nem létezik!';
}
?>
A fenti kódban az "isset" nevű függvényt használjuk. Ez logikai formában visszaadja (true/false), hogy a paraméterben megadott változó be van-e állítva, azaz létezik-e:
bool isset($valtozo);
Egy egyszerű feltétel (if) segítségével kiíratjuk a változót ha létezik, vagy hibaüzenetet ha nem (else).
A fenti kód futtatásával ellenőrizhetjük, hogy egy sima link segítségével meghívott második oldal nem látja az első oldalon létrehozott változókat.
Viszont, ha a linket kiegészítjük a következő módon, akkor megtesszük az első lépést az adatok átadása felé:
oldal1.php:
<?php
$valtozo1 = "Teszt";
$valtozo2 = "SimplePHP";
?>
<a href="oldal2.php?valtozo1=Teszt">Oldal 2</a>
A lényeg az "oldal2.php" után lévő "?valtozo1=Teszt" rész. Ha most megnézzük a böngészőnkben a második oldal URL sorát, akkor láthatjuk, hogy ott is megjelent a link után a "?valtozo1=Teszt" rész.
Most a "valtozo1" és az értéke belekerül egy asszociatív tömbbe, amit Szuper globális változónak (Super global variable) hívunk. Ez azért érdemelte ki a "szuper globális" nevet, mert az egész oldalon bárhol elérhető (példánkban az oldal2.php-n), és már akkor hozzárendelődik az oldalhoz, mielőtt egyetlen sornyi PHP kód is feldolgozásra került volna.
Több ilyen változó is létezik, a mi példánkban, amikor link útján továbbítjuk a változókat, a $_GET nevezetű használandó.
Most pedig lássuk, hogy tudunk ehhez a változóhoz hozzáférni.
olda2.php:
<?php
$valtozo1 = $_GET['valtozo1'];
if (isset($valtozo1)) {
echo $valtozo1;
} else {
echo '$valtozo1 nem létezik!';
}
echo "<br />"; // Sortörés
if (isset($valtozo2)) {
echo $valtozo2;
} else {
echo '$valtozo2 nem létezik!';
}
?>
És végre! A valtozo1 megkapta az értékét, ami az oldal1.php-n hozzárendelt "Teszt" szöveg volt. Tehát, a lényeg: a linkek segítségével továbbított változók a $_GET szuper globális változóhoz rendelődnek hozzá.
Jó, ez már félsiker. Most azt nézzük meg, hogyan tudunk több változót továbbítani egyszerre. Térjünk vissza az első oldalunkhoz:
oldal1.php:
<?php
$valtozo1 = "Teszt";
$valtozo2 = "SimplePHP";
?>
<a href="oldal2.php?valtozo1=Teszt&valtozo2=SimplePHP">Oldal 2</a>
A megoldást az "&" jel jelenti. Ez után írhatjuk a következő változónkat, ahogy a fenti példa mutatja. Természetesen, még több változót is hozzárendelhetünk, csak válasszuk el az "&" jellel őket.
Most már megvan a két változónk, a második oldalon is használhatjuk őket.
oldal2.php:
<?php
$valtozo1 = $_GET['valtozo1'];
$valtozo2 = $_GET['valtozo2'];
if (isset($valtozo1)) {
echo $valtozo1;
} else {
echo '$valtozo1 nem létezik!';
}
echo "<br />"; // Sortörés
if (isset($valtozo2)) {
echo $valtozo2;
} else {
echo '$valtozo2 nem létezik!';
}
?>
A következő lépés, hogy a linkekhez a változók értékeit dinamikusan rendeljük hozzá, az első oldalon. A megoldás egyszerű használjuk a jól bevált "echo" függvényt.
oldal1.php:
<?php
$valtozo1 = "Teszt";
$valtozo2 = "SimplePHP";
?>
<a href="oldal2.php?valtozo1=<?php echo $valtozo1; ?>
&valtozo2=<?php echo $valtozo2; ?>">Oldal 2</a>
Tehát, a változók értékeit "<?php" és "?>" közé elhelyezett "echo" függvénnyel írjuk ki, így ha változik a két változó értéke, akkor a link is velük együtt változik.
A poszt címében biztonságos linkeket ígértem. Próbáljuk ki a következő kódot.
oldal1.php:
<?php
$cegnev = "Procter & Gamble";
?>
<a href="oldal2.php?cegnev=<?php echo $cegnev; ?>">Oldal 2</a>
oldal2.php:
<?php
$cegnev = $_GET['cegnev'];
if (isset($cegnev)) {
echo $cegnev;
} else {
echo '$cegnev nem létezik!';
}
?>
Ha futtatjuk a kódot, eredményül "Procter " szöveget kapjuk. Hová tűnt a második fele? A problémát a névben lévő "&" karakter okozza, mert ahogy korábban láthattuk, ezzel választjuk el a változókat egymástól. Ezt a linkek számára fenntartott karakternek hívjuk, és nem ez az egyetlen.
Fenntartott karakterek:
! # $ % & ' ( ) * + , / : ; = ? @ [ ]
Igen, ezek mind gondot okoznak. Szerencsére PHP-ben ezt egyszerű orvosolni, csak használjuk az "urlencode" függvényt, ami a problémás karaktereket biztonságos formátumra konvertálja.
oldal1.php:
<?php
$cegnev = "Procter & Gamble";
?>
<a href="oldal2.php?cegnev=<?php echo urlencode($cegnev); ?>">Oldal 2</a>
Így már megfelelő az eredmény.
Ha megnézzük a második oldalon a böngészősávban a linket, ilyen formában látjuk:
oldal2.php?cegnev=Procter+%26+Gamble
Ez a link megfelelő formátuma, ami már a helyes eredményt adja.
Ennyi volt mára. A témával azonban még nem végeztünk, mert az oldal2.php jelen formájában számos biztonsági kockázattal jár, ezeket is orvosolnunk kell. Ezért ezt a témát még folytatni fogjuk...