3 módszer a biztonságos munkamenet -kezelő rendszer létrehozására PHP és MySQL rendszerben

Tartalomjegyzék:

3 módszer a biztonságos munkamenet -kezelő rendszer létrehozására PHP és MySQL rendszerben
3 módszer a biztonságos munkamenet -kezelő rendszer létrehozására PHP és MySQL rendszerben

Videó: 3 módszer a biztonságos munkamenet -kezelő rendszer létrehozására PHP és MySQL rendszerben

Videó: 3 módszer a biztonságos munkamenet -kezelő rendszer létrehozására PHP és MySQL rendszerben
Videó: How to Become a Web Designer, Explained in 1 Minute 2024, Április
Anonim

Ez az útmutató megmutatja, hogyan tárolhatja biztonságosan a munkameneteket a mySQL adatbázisban. Ezenkívül titkosítjuk az adatbázisba kerülő összes munkamenet-adatot, ami azt jelenti, hogy ha valakinek sikerül feltörnie az adatbázist, az összes munkamenet-adat 256 bites AES titkosítással van titkosítva.

Lépések

3. módszer: Állítsa be a mySQL adatbázist

2238751 1
2238751 1

1. lépés: Hozzon létre egy MySQL adatbázist

Ebben az útmutatóban létrehozunk egy "secure_sessions" nevű adatbázist.

Tekintse meg, hogyan hozhat létre-a-adatbázis-in-phpMyAdmin.

Vagy használhatja az alábbi SQL -kódot, és létrehozhat egyet az Ön számára.

Adatbázis kód létrehozása:

CREATE DATABASE `secure_sessions`;

Megjegyzés: Egyes tárhelyszolgáltatások nem teszik lehetővé adatbázis létrehozását a phpMyAdmin segítségével. További információ a cPanel alkalmazásban.

2238751 2
2238751 2

2. lépés. Hozzon létre egy felhasználót, aki csak SELECT, INSERT és DELETE jogosultságokkal rendelkezik

Ez azt jelenti, hogy ha valaha is megsértették a szkriptünket, a hacker nem tudta eldobni a táblákat az adatbázisunkból. Ha valóban paranoiás, akkor hozzon létre egy másik felhasználót minden funkcióhoz.

  • Felhasználó:

    "sec_user"

  • Jelszó:

    "eKcGZr59zAa2BEWU"

Felhasználói kód létrehozása:

FELHASZNÁLÓ LÉTREHOZÁSA 'sec_user'@'localhost' AZONOSÍTJA: 'eKcGZr59zAa2BEWU'; GRANT SELECT, INSERT, UPDATE, DELETE ON "secure_sessions".* TO 'sec_user'@'localhost';

Megjegyzés: Érdemes megváltoztatni a jelszót a fenti kódban, ha saját szerverén fut. (Feltétlenül változtassa meg a PHP -kódját is.) Ne feledje, hogy nem feltétlenül olyan jelszónak kell lennie, amelyre emlékezhet, így a lehető legbonyolultabb legyen. Itt egy véletlen jelszógenerátor.

2238751 3
2238751 3

Lépés 3. Hozzon létre egy "session" nevű MySQL táblát

Az alábbi kód létrehoz egy táblázatot 4 mezővel (id, set_time, data, session_key).

Hozza létre a "munkamenetek" táblázatot:

CREATE TABLE "session" ("id" char (128) NOT NULL, "set_time" char (10) NOT NULL, "data" text NOT NULL, "session_key" char (128) NOT NULL, PRIMARY KEY ("id")) MOTOR = InnoDB DEFAULT CHARSET = latin1;

A CHAR adattípust használjuk az általunk ismert hosszúságú mezőkhöz, mivel az "id" és a "session_key" mezők mindig 128 karakter hosszúak lesznek. Ha itt használja a CHAR -t, megspórolhatja a feldolgozási teljesítményt.

2. módszer a 3 -ból: Hozzon létre session.class.php fájlt

2238751 4
2238751 4

1. lépés: Osztály létrehozása

Új osztály indításához be kell írnia az alábbi kódot:

Új osztály:

osztályfoglalkozás {

2238751 5
2238751 5

2. lépés. Hozza létre a _construct függvényt

Ezt a függvényt minden alkalommal meghívjuk, amikor új példányt hozunk létre egy objektumról a „session” osztály használatával. A PHP _construct függvényről itt olvashat.

Ez a funkció beállítja az egyéni munkamenet -kezelőnket, így azonnal elérhetővé válik, amint az osztályt létrehozzák (azaz elkészítették/megépítették/elkészítették).

_construct függvény:

function _construct () {// állítsa be egyéni munkamenet -funkcióinkat. session_set_save_handler (tömb ($ this, 'open'), tömb ($ this, 'close'), tömb ($ this, 'read'), tömb ($ this, 'write'), tömb ($ this, 'delete')), tömb ($ this, 'gc')); // Ez a sor megakadályozza a váratlan hatásokat, amikor objektumokat használ mentéskezelőként. register_shutdown_function ('session_write_close'); }

2238751 6
2238751 6

3. Létrehozása start_session függvény

Ezt a funkciót minden alkalommal meghívják, amikor új munkamenetet szeretne indítani, használja a session_start () helyett. Tekintse meg a kód megjegyzéseit, hogy megtudja, mit tesznek az egyes sorok.

start_session függvény:

function start_session ($ session_name, $ secure) {// Győződjön meg arról, hogy a munkamenet -cookie nem érhető el javascript -en keresztül. $ httponly = igaz; // Hash algoritmus a munkamenethez. (használja a hash_algos () parancsot a rendelkezésre álló kivonatok listájának megtekintéséhez.) $ session_hash = 'sha512'; // Ellenőrizze, hogy a hash elérhető -e, ha (in_array ($ session_hash, hash_algos ()))) {// Állítsa be a has függvényt. ini_set ('session.hash_function', $ session_hash); } // Hány bit a kivonat karakterénként. // A lehetséges értékek a '4' (0-9, a-f), '5' (0-9, a-v) és '6' (0-9, a-z, A-Z, "-", ","). ini_set ('session.hash_bits_per_character', 5); // A munkamenet kényszerítése, hogy csak cookie -kat használjon, URL -változókat ne. ini_set ('session.use_only_cookies', 1); // Munkamenet cookie paraméterek lekérése $ cookieParams = session_get_cookie_params (); // Állítsa be a session_set_cookie_params paramétereket ($ cookieParams ["élettartam"], $ cookieParams ["path"], $ cookieParams ["domain"], $ secure, $ httponly); // A munkamenet nevének módosítása session_name ($ session_name); // Most elkezdjük a munkamenetet session_start (); // Ez a sor regenerálja a munkamenetet, és törli a régit. // Új titkosítási kulcsot is generál az adatbázisban. session_regenerate_id (true); }

2238751 7
2238751 7

4. lépés: Nyitott függvény létrehozása

Ezt a funkciót a PHP munkamenetek hívják meg, amikor új munkamenetet indítunk, ezzel új adatbázis -kapcsolatot indítunk.

nyitott funkció:

function open () {$ host = 'localhost'; $ user = 'sec_user'; $ pass = 'eKcGZr59zAa2BEWU'; $ name = 'secure_sessions'; $ mysqli = új mysqli ($ host, $ user, $ pass, $ name); $ ez-> db = $ mysqli; return true; }

2238751 8
2238751 8

5. lépés: Zárási funkció létrehozása

Ezt a funkciót akkor hívják meg, ha a munkamenetet le akarják zárni.

bezárási funkció:

function close () {$ this-> db-> close (); return true; }

2238751 9
2238751 9

6. lépés. Olvasási funkció létrehozása

Ezt a függvényt hívja meg a PHP, amikor megpróbálunk hozzáférni egy munkamenethez, például amikor használjuk az echo $ _SESSION ['valamit'];. Mivel egy oldalon sok hívás lehet erre a funkcióra, nem csak a biztonság, hanem a teljesítmény érdekében is kihasználjuk az elkészített nyilatkozatokat. Csak egyszer készítjük el a nyilatkozatot, majd sokszor végrehajthatjuk.

Az adatbázisban titkosított munkamenet -adatokat is dekódoljuk. A munkamenetek során 256 bites AES titkosítást használunk.

olvasási funkció:

function read ($ id) {if (! isset ($ this-> read_stmt)) {$ this-> read_stmt = $ this-> db-> előkészítés ("SELECT data FROM SESSES WHERE id =? LIMIT 1"); } $ this-> read_stmt-> bind_param ('s', $ id); $ this-> read_stmt-> execute (); $ this-> read_stmt-> store_result (); $ this-> read_stmt-> bind_result ($ adatok); $ this-> read_stmt-> fetch (); $ kulcs = $ ez-> getkey ($ id); $ data = $ this-> decrypt ($ data, $ key); $ adatok visszaadása; }

2238751 10
2238751 10

7. lépés. Írási függvény létrehozása

Ezt a funkciót akkor használjuk, ha értéket rendelünk a munkamenethez, például $ _SESSION ['valami'] = 'valami más';. A funkció titkosítja az adatbázisba illesztett összes adatot.

írási funkció:

function write ($ id, $ data) {// Egyedi kulcs beszerzése $ key = $ this-> getkey ($ id); // Adatok titkosítása $ data = $ this-> encrypt ($ data, $ key); $ time = time (); if (! isset ($ this-> w_stmt)) {$ this-> w_stmt = $ this-> db-> előkészít ("REPLACE INTO session (id, set_time, data, session_key) VALUES (?,?,?,?) "); } $ this-> w_stmt-> bind_param ('sis', $ id, $ time, $ data, $ key); $ this-> w_stmt-> execute (); return true; }

2238751 11
2238751 11

8. Létrehozás megsemmisítése függvény

Ez a függvény törli a munkamenetet az adatbázisból, ezt használja a php, amikor olyan függvényeket hívunk meg, mint a session_destroy ();.

megsemmisítési funkció:

függvény megsemmisítése ($ id) {if (! isset ($ this-> delete_stmt)) {$ this-> delete_stmt = $ this-> db-> előkészítés ("DELETE FROM SESSES WHERE id =?"); } $ this-> delete_stmt-> bind_param ('s', $ id); $ this-> delete_stmt-> execute (); return true; }

2238751 12
2238751 12

9. lépés. Hozza létre a gc (szemétgyűjtő) funkciót

Ez a funkció a szemétgyűjtő funkció, amelyet a régi munkamenetek törlésére hívnak. A funkció meghívásának gyakoriságát két konfigurációs irányelv határozza meg: session.gc_probability és session.gc_divisor.

gc () függvény:

function gc ($ max) {if (! isset ($ this-> gc_stmt)) {$ this-> gc_stmt = $ this-> db-> előkészítés ("DELETE FROM MENETEK WHERE set_time <?"); } $ old = time () - $ max; $ this-> gc_stmt-> bind_param ('s', $ old); $ this-> gc_stmt-> execute (); return true; }

2238751 13
2238751 13

10. lépés. Hozza létre a getKey függvényt

Ez a funkció arra szolgál, hogy a munkamenetek táblájából megkapja a titkosításhoz szükséges egyedi kulcsot. Ha nincs munkamenet, akkor csak egy új véletlenszerű kulcsot ad vissza a titkosításhoz.

getkey () Funkció:

privát függvény getkey ($ id) {if (! isset ($ this-> key_stmt)) {$ this-> key_stmt = $ this-> db-> prepa ("SELECT session_key FROM session WHERE id =? LIMIT 1"); } $ this-> key_stmt-> bind_param ('s', $ id); $ this-> key_stmt-> execute (); $ this-> key_stmt-> store_result (); if ($ this-> key_stmt-> num_rows == 1) {$ this-> key_stmt-> bind_result ($ key); $ this-> key_stmt-> fetch (); return $ gomb; } else {$ random_key = hash ('sha512', uniqid (mt_rand (1, mt_getrandmax ()), igaz)); return $ random_key; }}

2238751 14
2238751 14

11. lépés: Hozzon létre titkosítási és visszafejtési függvényeket

Ezek a funkciók titkosítják a munkamenetek adatait, az adatbázisból származó titkosítási kulcsot használnak, amely minden munkamenethez eltérő. Nem közvetlenül használjuk ezt a kulcsot a titkosításban, de arra használjuk, hogy még véletlenszerűbbé tegyük a kulcskivonatot.

titkosítás () és visszafejtés () függvények:

privát függvény titkosítása ($ data, $ key) {$ salt = 'cH! swe! retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39 = E@rAsp7c-Ph@pH'; $ key = substr (hash ('sha256', $ salt. $ key. $ salt), 0, 32); $ iv_size = mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); $ iv = mcrypt_create_iv ($ iv_size, MCRYPT_RAND); $ encrypted = base64_encode (mcrypt_encrypt (MCRYPT_RIJNDAEL_256, $ kulcs, $ data, MCRYPT_MODE_ECB, $ iv)); return $ titkosítva; } privát függvény dekódolása ($ data, $ key) {$ salt = 'cH! swe! retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39 = E@rAsp7c-Ph@pH'; $ key = substr (hash ('sha256', $ salt. $ key. $ salt), 0, 32); $ iv_size = mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); $ iv = mcrypt_create_iv ($ iv_size, MCRYPT_RAND); $ decrypted = mcrypt_decrypt (MCRYPT_RIJNDAEL_256, $ kulcs, base64_decode ($ data), MCRYPT_MODE_ECB, $ iv); $ decrypted = rtrim ($ decrypted, "\ 0"); return $ visszafejtve; }

2238751 15
2238751 15

12. lépés. Vége az osztálynak

Itt csak befejezzük az osztályok gömbölyű zárójeleit:

Vége osztály:

}

3. módszer 3 -ból: Oldalak létrehozása munkamenetekkel

2238751 16
2238751 16

1. lépés: A munkamenetek használata az egyéni munkamenet -kezelővel

Az alábbiakban bemutatjuk, hogyan indíthat új munkamenetet; ezt minden olyan oldalra fel kell vennie, amelyhez hozzáférni szeretne a munkamenetekhez, használja a session_start () helyett;

A munkamenet indítása:

igényel ('session.class.php'); $ session = new session (); // Igazra állítva, ha a https $ session-> start_session ('_ s', false) értéket használja; $ _SESSION ['something'] = 'Érték.'; echo $ _SESSION ['valami'];

Ajánlott: