kliens között HTTP protokollt használó, kérés-válasz felépítésű kommunikáció zajlik, azaz a szerver csak akkor küld adatot a kliensnek, ha az kéréssel fordul hozzá. A szerver az adott kérést értelmezve elküldi a megfelelő erőforrást a kliensnek, legyen az HTML oldal, kép, vagy más jellegű adat. A kommunikáció állapotmentes, minden kérés a szerver felé egyedi, a szerver nem tartja számon, hogy érkezett-e már korábban kérés az adott klienstől. HTTP: Hyper Text Transfer Protocoll HTML: Hyper Text Markup Language HTTP metódusok • GET: az URL-ben láthatóak az átadott paraméterek, például: http://www.google.com/search?q=cica • POST: az átadott paraméterek a HTTP fejlécekben utaznak, például: POST /test/demo_form.php HTTP/1.1 Host: w3schools.com name=dug&password=squirrel
method=”post”> <input name=”username” type=”text” placeholder=”Felhasználónév”> <input name=”password” type=”password” placeholder=”Jelszó”> <input name=”formid” type=”hidden” value=”loginform”> <button type=”submit”>Bejelentkezés</button> </form> method: az adatok elküldéséhez használt HTTP metódus input: beviteli mező name: a mező neve, ez lesz a kulcs-érték párok kulcsa type: a beviteli mező típusa, text a szöveg, password a jelszó, hidden a láthatatlan, stb., illetve gomb típusa (egyszerű vagy űrlap elküldő) placeholder: üres mező esetén az alapértelmezett felirat (nem alapértelmezett érték) value: (alapértelmezett) érték
speciális változókban tárolja a beérkezett kérések paramétereit. A paraméterek a következő változónevekkel ellátott asszociatív tömbökben találhatóak: $_GET: a GET metódussal küldött adatokat tartalmazza $_POST: a POST metódussal küldött adatokat tartalmazza Asszociatív tömb Kulcs-érték párok tárolására alkalmas adatstruktúra. A tömb indexe numerikus (egész szám) érték mellett lehet szöveges érték is, ekkor kulcsnak hívjuk. A HTML űrlapok szervernek elküldésekor a megadott HTTP metódusnak megfelelő asszociatív tömb kerül feltöltésre úgy, hogy - a kulcsok a beviteli mezők nevei - az értékek a beviteli mezők értéke (value) FONTOS! Az adatok típusának ellenőrzését szerver- és kliens oldalon is, de legalább szerver oldalon el kell végezni! Ha egy mezőbe telefonszámot, emailt, számsort várunk, ellenőrizni kell, hogy valóban a megfelelő típusú érték került elküldésre. Emellett fontos, hogy a bejövő adatokat előkészítsük az adatbázisba írásra, azaz a megfelelő formátumban, megfelelő hosszúsággal stb. rendelkezzen.
bíz bizonyos információkat, amelyek biztonságos tárolására különös figyelmet kell fordítanunk. Fontos, hogy csak annyi információt kérjünk a regisztrációhoz, amelyre feltétlen szükségünk van, például email cím, felhasználónév, név, jelszó. A korlátozott információval magunkat is védjük az adatokkal való visszaélés vádjával szemben, illetve ha hozzáfér valaki a tárolt adatokhoz, ő sem tudja ártó szándékkal felhasználni azokat. Adatbázis tervezése Az adatbázis megtervezésekor meg kell becsülni a tárolandó adatok maximális hosszát és ennek megfelelő méretű adatmezőket kell beállítani. Nagy méretű adattáblák esetén jelentős tárhelyet lehet nyerni a jó tervezéssel.
ellenőrzéseket kell végrehajtani: • A felhasználó a megfelelő típusú és valós adatokat adott-e meg (email, telefonszám, felhasználónév) • Létezik-e már a adott azonosítójú felhasználó (azonosításra használt adattól függően email, felhasználói név ellenőrzése) • Regisztrációnál megfelelően adta-e meg a felhasználó a jelszavát? Ellenőrzésre használható, ha kétszer kérjük be a felhasználótól a kívánt jelszót. Ha mindkét alkalommal helyesen adta meg, akkor azt használjuk jelszónak.
tároljuk az adatbázisban. Erre az úgy nevezett hasító függvényeket használjuk (hashing algorithm) Hasító függvény Tetszőleges hosszúságú és típusú adatból fix hosszúságú karaktersort állít elő. Azonos bemenetre azonos kimenetet állít elő. Az előállított karaktersorból az eredeti adatsor nem állítható vissza, a titkosítás egyirányú. Regisztráció A felhasználó megadja a jelszót, amelyet titkosítunk, majd eltároljuk az adatbázisba. Autentikáció / azonosítás A felhasználó megadja a jelszavát, előállítjuk belőle a titkosított kódot, majd összehasonlítjuk az adatbázisban tárolt titkosított értékkel.
Amennyiben két felhasználó azonos jelszót használ, az adatbázisban azonos hash kerül eltárolásra. A gyakran használt jelszavak hash-e ismert. A előre legenerált jelszavakat tartalmazó táblákkal a hash-hez tartozó jelszó hamar kideríthető. Megoldás A jelszó titkosítása előtt a felhasználó által megadott jelszót a felhasználóra szabottan egyedi módszerrel módosítjuk, például: - belekeverjük a felhasználónevet a jelszóba - generálunk a felhasználóhoz egy egyedi kulcsot, amit a jelszó módosításához használunk A jelszó titkosítás előtti egyedi módosítását sózásnak/salting-nak hívjuk.
Az eltárolt jelszavak adott kódolással vannak eltárolva. A számítási kapacitás növekedésével a hasító algoritmusok számítása gyorsabbá válik. Frissíteni kell a felhasználó jelszavait, amivel több probléma is van: - Mivel nem tudjuk, hogy mi az eredeti jelszó, frissíteni csak felhasználói bejelentkezéskor tudunk. - Tudnunk kell, hogy az adott felhasználónál frissítettük-e már a jelszót. Megoldás Egyedi megoldás esetén az adatbázisban vagy az előállított titkos kulcsban kell eltárolnunk a titkosításra használt algoritmus azonosítóját. A PHP 5.5 felett már beépítve tartalmaz jelszó kezeléssel kapcsolatos metódusokat, amelyek speciális formátumú hash-t használnak a kódolási paraméterek tárolására: - password_hash: a megadott szövegből az aktuálisan ajánlott titkosítással előállítja a hash-t - password_verify: a password_hash által előállított hash-sel hasonlítja össze a megadott jelszót - password_needs_rehash: megmondja az adott hash-ról, hogy régi titkosítási algoritmussal lett-e előállítva
a PHP által beépített jelszó kezelőre for($i = 0; $i < 5; $i++){ echo password_hash("kutya", PASSWORD_DEFAULT)."\n"; } Kimenet $2y$10$86/z10WhwDB3xY6gpxpsj.IZ4/YzhJmQKfKts1aab9aS9n2hf/m3e $2y$10$MImt.cqwvcdLwYWZ/o/KMOoIMlRhcSbamDRRyd.fICxu8V4qzuQA. $2y$10$Iln0eIRMgmKPXaoaXJ7j2eMlLzCSKk6P8vZbjU8zyysQfaWKgXu3m $2y$10$UVlaP1wBQ1SSh8q3nQc3fusyZUaFMG5HRRbe16KCN8VRawAQEudwG $2y$10$/h87Y6rQVvJPHhZSi4cbke0s4UXXzXYxtWI.A2I3iCWKvWe5G.//6 Látható, hogy azonos jelszóra más és más kimenetet generál. A kimenet felépítése a következő: - titkosítási algoritmus azonosítója - titkosítási algoritmus egyéb paramétere - sózáshoz használt egyedi kulcs (salt) - a sózott jelszóból adott algoritmussal előállított hash