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
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.
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.
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
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 {
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'); }
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); }
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; }
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; }
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; }
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; }
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; }
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; }
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; }}
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; }
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
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'];