PHP- ում և MySQL- ում անվտանգ նիստերի կառավարման համակարգ ստեղծելու 3 եղանակ

Բովանդակություն:

PHP- ում և MySQL- ում անվտանգ նիստերի կառավարման համակարգ ստեղծելու 3 եղանակ
PHP- ում և MySQL- ում անվտանգ նիստերի կառավարման համակարգ ստեղծելու 3 եղանակ

Video: PHP- ում և MySQL- ում անվտանգ նիստերի կառավարման համակարգ ստեղծելու 3 եղանակ

Video: PHP- ում և MySQL- ում անվտանգ նիստերի կառավարման համակարգ ստեղծելու 3 եղանակ
Video: Իտալիայից 3 տոննա կոկաին էին պատրաստվում ուղարկել Հայաստան 2024, Ապրիլ
Anonim

Այս ուղեցույցը ցույց կտա ձեզ, թե ինչպես կարող եք ապահով կերպով պահել ձեր նիստերը mySQL տվյալների բազայում: Մենք նաև ծածկագրելու ենք տվյալների բազա մտնող նստաշրջանի բոլոր տվյալները, ինչը նշանակում է, որ եթե որևէ մեկին հաջողվի կոտրել տվյալների բազա, նիստի բոլոր տվյալները կոդավորված են 256-բիթանոց AES կոդավորմամբ:

Քայլեր

Մեթոդ 1 -ից 3 -ը. Կարգավորել mySQL տվյալների շտեմարանը

2238751 1
2238751 1

Քայլ 1. Ստեղծեք MySQL տվյալների բազա:

Այս ուղեցույցում մենք կստեղծենք տվյալների բազա, որը կոչվում է «safe_sessions»:

Տեսեք, թե ինչպես ստեղծել- a-Database-in-phpMyAdmin.

Կամ կարող եք օգտագործել SQL կոդը, որը կստեղծի ձեզ համար:

Ստեղծեք տվյալների բազայի կոդ.

Ստեղծել տվյալների բազա `ապահով_ նիստեր;

Նշում. Հոսթինգի որոշ ծառայություններ թույլ չեն տալիս տվյալների բազա ստեղծել phpMyAdmin- ի միջոցով: Իմացեք, թե ինչպես դա անել cPanel- ում:

2238751 2
2238751 2

Քայլ 2. Ստեղծեք օգտվող միայն SELECT, INSERT և DELETE արտոնություններով:

Սա նշանակում է, որ եթե մեր սցենարում երբևէ անվտանգության խախտում լիներ, հաքերը չէր կարող սեղաններ հանել մեր տվյալների շտեմարանից: Եթե իսկապես պարանոյիկ եք, ապա յուրաքանչյուր գործառույթի համար ստեղծեք այլ օգտվող:

  • Օգտվող:

    "sec_user"

  • Գաղտնաբառ:

    "eKcGZr59zAa2BEWU"

Ստեղծել օգտվողի ծածկագիր.

Ստեղծել օգտվող 'sec_user'@'localhost' IDENTIFIED BY 'eKcGZr59zAa2BEWU'; ՏՐԱՄԱԴՐԵԼ ԸՆՏՐՈԹՅՈՆ, ՆԵՐԿԱՅԱՆԵԼ, ԹԱՐՄԱՆԵԼ, DEՆTEԵԼ `« safe_sessions » - ում:* Դեպի 'sec_user'@'localhost';

Նշում. Լավ կլինի, որ ձեր սերվերի վրա աշխատելիս վերը նշված ծածկագրում փոխեք գաղտնաբառը: (Համոզվեք, որ դուք նաև փոխում եք ձեր PHP ծածկագիրը): Հիշեք, որ այն չպետք է լինի գաղտնաբառ, որը կարող եք հիշել, որպեսզի հնարավորինս բարդ լինի: Ահա պատահական գաղտնաբառ գեներատոր:

2238751 3
2238751 3

Քայլ 3. Ստեղծեք «նիստեր» անունով MySQL աղյուսակ:

Ստորև բերված ծածկագիրը ստեղծում է 4 դաշտ ունեցող աղյուսակ (id, set_time, data, session_key):

Ստեղծեք «նստաշրջաններ» աղյուսակը.

ՍՏԵԵԼ ՍԵABԱՆԻ «նիստեր» (`id` char (128) NOT NULL,` set_time` char (10) NOT NULL, `data` text NOT NULL,` session_key` char (128) NOT NULL, PRIMARY KEY (`id))) Շարժիչ = InnoDB DEFAULT CHARSET = latin1;

Մենք օգտագործում ենք CHAR տվյալների տիպը այն դաշտերի համար, որոնց երկարությունը մեզ հայտնի է, քանի որ «id» և «session_key» դաշտերը միշտ կլինեն 128 նիշ: Այստեղ CHAR- ի օգտագործումը խնայում է մշակման հզորությունը:

Մեթոդ 2 3 -ից. Ստեղծեք session.class.php ֆայլ

2238751 4
2238751 4

Քայլ 1. Ստեղծել դասարան:

Նոր դաս սկսելու համար հարկավոր է մուտքագրել ստորև նշված կոդը.

Նոր դասարան.

դասի նիստ {

2238751 5
2238751 5

Քայլ 2. Ստեղծել _construct գործառույթը:

Այս գործառույթը կկոչվի ամեն անգամ, երբ մենք ստեղծում ենք օբյեկտի նոր օրինակ `օգտագործելով« նստաշրջան »դասը: Դուք կարող եք կարդալ PHP _construct գործառույթը այստեղ:

Այս գործառույթը սահմանում է մեր սովորական նստաշրջանի կարգավորիչը, այնպես որ այն հասանելի է օգտագործման համար, հենց որ դասը պատրաստվի (այսինքն ՝ պատրաստված/կառուցված/կառուցված):

_կառուցել գործառույթը.

գործառույթը _construct () {// սահմանել մեր սովորական նստաշրջանի գործառույթները: session_set_save_handler (զանգված ($ this, 'open'), array ($ this, 'close'), array ($ this, 'read'), array ($ this, 'write'), array ($ this, 'ոչնչացնել')), զանգված ($ this, 'gc')); // Այս տողը կանխում է անսպասելի էֆեկտները, երբ օբյեկտներն օգտագործում են որպես պահող մշակողներ: register_shutdown_function ('session_write_close'); }

2238751 6
2238751 6

Քայլ 3. Ստեղծեք start_session գործառույթը:

Այս գործառույթը կկոչվի ամեն անգամ, երբ ցանկանում եք սկսել նոր նստաշրջան, օգտագործեք այն session_start- ի () փոխարեն: Տեսեք ծածկագրի մեկնաբանությունները ՝ տեսնելու, թե ինչ է անում յուրաքանչյուր տող:

start_session գործառույթը.

գործառույթը start_session ($ session_name, $ safe) {// Համոզվեք, որ նստաշրջանի cookie- ն հասանելի չէ javascript- ի միջոցով: $ httponly = ճշմարիտ; // Hash ալգորիթմ, որն օգտագործվում է նստաշրջանի համար: (օգտագործեք hash_algos () ՝ առկա հեշերի ցանկը ստանալու համար:) $ session_hash = 'sha512'; // Ստուգեք, արդյոք հեշը հասանելի է, եթե (in_array ($ session_hash, hash_algos ())) {// Սահմանել ունի գործառույթը: ini_set ('session.hash_function', $ session_hash); } // Քանի բիթ է հաշի մեկ նիշի համար: // Հնարավոր արժեքներն են '4' (0-9, a-f), '5' (0-9, a-v) և '6' (0-9, a-z, A-Z, "-", ","): ini_set ('session.hash_bits_per_character', 5); // Ստիպեք նիստին օգտագործել միայն թխուկներ, այլ ոչ թե URL փոփոխականներ: ini_set ('session.use_only_cookies', 1); // Ստացեք նիստի cookie- ի պարամետրեր $ cookieParams = session_get_cookie_params (); // Սահմանել պարամետրերը session_set_cookie_params ($ cookieParams [«ողջ կյանքի ընթացքում], $ cookieParams [« ուղի »], $ cookieParams [« տիրույթ »], $ ապահով, $ httponly); // Փոխել նիստի անունը session_name ($ session_name); // Այժմ մենք կատու ենք սկսում նիստը session_start (); // Այս տողը վերածնում է նստաշրջանը և ջնջում հինը: // Այն նաև տվյալների բազայում ստեղծում է նոր ծածկագրման բանալին: session_regenerate_id (ճշմարիտ); }

2238751 7
2238751 7

Քայլ 4. Ստեղծեք բաց գործառույթ:

Այս գործառույթը կանչվելու է PHP- ի նիստերով, երբ մենք սկսում ենք նոր նստաշրջան, այն օգտագործում ենք տվյալների բազայի նոր կապ սկսելու համար:

բաց գործառույթ.

գործառույթը բաց է () {$ host = 'localhost'; $ օգտվող = 'sec_user'; $ pass = 'eKcGZr59zAa2BEWU'; $ name = 'safe_session'; $ mysqli = նոր mysqli ($ host, $ user, $ pass, $ name); $ this-> db = $ mysqli; վերադարձնել ճշմարիտ; }

2238751 8
2238751 8

Քայլ 5. Ստեղծեք փակ գործառույթ:

Այս գործառույթը կանչվելու է, երբ նիստերը ցանկանում են փակվել:

փակման գործառույթ.

գործառույթը փակել () {$ this-> db-> փակել (); վերադարձնել ճշմարիտ; }

2238751 9
2238751 9

Քայլ 6. Ստեղծեք ընթերցման գործառույթ:

Այս գործառույթը կանչվելու է PHP- ով, երբ փորձում ենք մուտք գործել նստաշրջան, օրինակ, երբ օգտագործում ենք echo $ _SESSION ['ինչ -որ բան'];. Քանի որ այս գործառույթին մեկ էջում կարող են լինել բազմաթիվ զանգեր, մենք օգտվում ենք պատրաստված հայտարարություններից ՝ ոչ միայն անվտանգության, այլև կատարման համար: Մենք միայն մեկ անգամ ենք պատրաստում հայտարարությունը, այնուհետև կարող ենք այն կատարել բազմաթիվ անգամ:

Մենք նաև գաղտնագրում ենք նիստի տվյալները, որոնք կոդավորված են տվյալների բազայում: Մեր նիստերում մենք օգտագործում ենք 256-բիթանոց AES կոդավորումը:

կարդալ գործառույթը.

գործառույթը կարդալ ($ id) {եթե (! } $ this-> read_stmt-> bind_param ('s', $ id); $ this-> read_stmt-> կատարել (); $ this-> read_stmt-> store_result (); $ this-> read_stmt-> bind_result ($ data); $ this-> read_stmt-> վերցնել (); $ key = $ this-> getkey ($ id); $ data = $ this-> գաղտնագրել ($ data, $ key); վերադարձնել $ տվյալները; }

2238751 10
2238751 10

Քայլ 7. Ստեղծեք գրելու գործառույթ:

Այս ֆունկցիան օգտագործվում է, երբ մենք մի նստաշրջանի արժեք ենք տալիս, օրինակ ՝ $ _SESSION ['something'] = 'something else';. Ֆունկցիան կոդավորում է բոլոր տվյալները, որոնք տեղադրվում են տվյալների բազայում:

գրել գործառույթը.

գործառույթը գրել ($ id, $ տվյալներ) {// Ստանալ եզակի բանալին $ key = $ this-> getkey ($ id); // Գաղտնագրել տվյալները $ data = $ this-> ծածկագրել ($ data, $ key); $ ժամանակ = ժամանակ (); եթե (! isset ($ this-> w_stmt)) {$ this-> w_stmt = $ this-> db-> պատրաստել ("ՓՈՓՈԽԵԼ նիստերին (id, set_time, data, session_key) ԱՐUԵՔ (?,?,?,?) "); } $ this-> w_stmt-> bind_param ('siss', $ id, $ time, $ data, $ key); $ this-> w_stmt-> կատարել (); վերադարձնել ճշմարիտ; }

2238751 11
2238751 11

Քայլ 8. Ստեղծեք ոչնչացման գործառույթ:

Այս գործառույթը ջնջում է նիստը տվյալների բազայից, այն օգտագործվում է php- ի կողմից, երբ կանչում ենք գործառույթներ, ինչպիսիք են session_destroy ();

ոչնչացնել գործառույթը.

գործառույթը ոչնչացնել ($ id) {if (! isset ($ this-> delete_stmt)) {$ this-> delete_stmt = $ this-> db-> պատրաստել ("DEՆTEԵԼ նիստերից, որտեղից id =?"); } $ this-> delete_stmt-> bind_param ('s', $ id); $ this-> delete_stmt-> կատարել (); վերադարձնել ճշմարիտ; }

2238751 12
2238751 12

Քայլ 9. Ստեղծեք gc (աղբահան) գործառույթը:

Այս գործառույթը աղբահանության գործառույթն է, որը կոչվում է ջնջել հին նստաշրջանները: Այս գործառույթի կոչման հաճախականությունը որոշվում է կազմաձևման երկու դիրեկտիվով ՝ session.gc_probability և session.gc_divisor:

gc () գործառույթը.

ֆունկցիա gc ($ max) {if (! isset ($ this-> gc_stmt)) {$ this-> gc_stmt = $ this-> db-> պատրաստել ("DEՆTEԵԼ նիստերից, որտեղի՞ց է set_time <?"); } $ old = ժամանակը () - $ max; $ this-> gc_stmt-> bind_param ('s', $ old); $ this-> gc_stmt-> կատարել (); վերադարձնել ճշմարիտ; }

2238751 13
2238751 13

Քայլ 10. Ստեղծեք getKey գործառույթը:

Այս գործառույթը օգտագործվում է նիստերի սեղանից ծածկագրման յուրահատուկ բանալին ստանալու համար: Եթե նիստ չկա, այն պարզապես վերադարձնում է գաղտնագրման նոր պատահական բանալին:

getkey () գործառույթը:

մասնավոր գործառույթ getkey ($ id) {if (! isset ($ this-> key_stmt)) {$ this-> key_stmt = $ this-> db-> պատրաստել ("SEESS session key"-ից նիստերից WHERE id =? LIMIT 1 "); } $ this-> key_stmt-> bind_param ('s', $ id); $ this-> key_stmt-> կատարել (); $ this-> key_stmt-> store_result (); եթե ($ this-> key_stmt-> num_rows == 1) {$ this-> key_stmt-> bind_result ($ բանալի); $ this-> key_stmt-> բեռնել (); վերադարձնել $ բանալին; } else {$ random_key = hash ('sha512', uniqid (mt_rand (1, mt_getrandmax ()), true)); վերադարձնել $ random_key; }}

2238751 14
2238751 14

Քայլ 11. Ստեղծեք ծածկագրման և գաղտնագրման գործառույթներ:

Այս գործառույթները ծածկագրում են նիստերի տվյալները, դրանք օգտագործում են տվյալների բազայից գաղտնագրման բանալին, որը տարբեր է յուրաքանչյուր նստաշրջանի համար: Մենք ուղղակիորեն չենք օգտագործում այդ բանալին գաղտնագրման մեջ, այլ այն օգտագործում ենք բանալին հեշն ավելի պատահական դարձնելու համար:

encrypt () և decrypt () գործառույթները.

մասնավոր գործառույթը ծածկագրում է ($ տվյալներ, $ բանալի) {$ salt = 'cH! swe! retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39 = E@rAsp7c-Ph@pH'; $ key = substr (հեշ ('sha256', $ աղ. $ բանալի. $ աղ), 0, 32); $ iv_size = mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); $ iv = mcrypt_create_iv ($ iv_size, MCRYPT_RAND); $ կոդավորված = base64_encode (mcrypt_encrypt (MCRYPT_RIJNDAEL_256, $ բանալի, $ տվյալներ, MCRYPT_MODE_ECB, $ iv)); վերադարձնել $ կոդավորված; } մասնավոր գործառույթի գաղտնագրում ($ տվյալներ, $ բանալի) {$ salt = 'cH! swe! retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39 = E@rAsp7c-Ph@pH'; $ key = substr (հեշ ('sha256', $ աղ. $ բանալի. $ աղ), 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, $ key, base64_decode ($ data), MCRYPT_MODE_ECB, $ iv); $ decrypted = rtrim ($ decrypted, "\ 0"); վերադարձնել գաղտնագրված $; }

2238751 15
2238751 15

Քայլ 12. Ավարտի դաս:

Այստեղ մենք պարզապես ավարտում ենք դասերի գանգուր փակագծերը.

Ավարտի դաս.

}

Մեթոդ 3 -ից 3 -ը ՝ Նիստերով էջերի ստեղծում

2238751 16
2238751 16

Քայլ 1. Նիստերի օգտագործումը սովորական նստաշրջանի կառավարչի հետ:

Ստորև ներկայացված է, թե ինչպես կսկսեիք նոր նստաշրջան. դուք պետք է դա ներառեք յուրաքանչյուր էջում, որտեղ ցանկանում եք մուտք գործել նիստերին, օգտագործել այն session_start- ի փոխարեն ();

Նիստ սկսելը.

պահանջել ('session.class.php'); $ session = նոր նստաշրջան (); // Սահմանել true եթե օգտագործում եք https $ session-> start_session ('_ s', false); $ _SESSION ['ինչ -որ բան'] = 'Արժեք:'; արձագանք $ _SESSION ['ինչ -որ բան'];

Խորհուրդ ենք տալիս: