3 Mga paraan upang Lumikha ng isang Secure Session Management System sa PHP at MySQL

Talaan ng mga Nilalaman:

3 Mga paraan upang Lumikha ng isang Secure Session Management System sa PHP at MySQL
3 Mga paraan upang Lumikha ng isang Secure Session Management System sa PHP at MySQL

Video: 3 Mga paraan upang Lumikha ng isang Secure Session Management System sa PHP at MySQL

Video: 3 Mga paraan upang Lumikha ng isang Secure Session Management System sa PHP at MySQL
Video: 9 Passive Income Ideas | How You Make $5000 A Month (Side Hustle Ideas) 2024, Mayo
Anonim

Ipapakita sa iyo ng gabay na ito kung paano mo maiimbak ang iyong mga session nang ligtas sa isang mySQL database. I-encrypt din namin ang lahat ng data ng session na pumupunta sa database, na nangangahulugang kung may nagawang mag-hack sa database ang lahat ng data ng session ay naka-encrypt ng 256-bit na pag-encrypt ng AES.

Mga hakbang

Paraan 1 ng 3: I-configure ang mySQL Database

2238751 1
2238751 1

Hakbang 1. Lumikha ng isang MySQL database

Sa gabay na ito lilikha kami ng isang database na tinatawag na "secure_sessions".

Tingnan kung paano Lumikha-a-Database-in-phpMyAdmin.

O maaari mong gamitin ang SQL code sa ibaba ay lilikha ng isa para sa iyo.

Lumikha ng Database Code:

GUMAWA NG DATABASE `secure_sessions`;

Tandaan: Ang ilang mga serbisyo sa pagho-host ay hindi pinapayagan kang lumikha ng isang database sa pamamagitan ng phpMyAdmin, Alamin kung paano ito gawin sa cPanel.

2238751 2
2238751 2

Hakbang 2. Lumikha ng isang gumagamit na may mga pribilehiyong SELECT, INSERT at TANGGALIN lamang

Nangangahulugan ito na kung mayroong kailanman paglabag sa seguridad sa aming script ang hacker ay hindi maaaring mag-drop ng mga talahanayan mula sa aming database. Kung paranoid ka talaga, lumikha ng ibang gumagamit para sa bawat pagpapaandar.

  • Gumagamit:

    "sec_user"

  • Password:

    "eKcGZr59zAa2BEWU"

Lumikha ng User Code:

GUMAWA NG GAMIT NG USER 'sec_user' @ 'localhost' IDENTIFIED BY 'eKcGZr59zAa2BEWU'; MAGPILI NG PILI, INSERT, I-UPDATE, TANGGAL SA `secure_sessions`. * TO 'sec_user' @ 'localhost';

Tandaan: Magandang ideya na baguhin ang password sa code sa itaas kapag tumatakbo sa iyong sariling server. (Tiyaking binago mo rin ang iyong PHP code.) Tandaan na hindi ito kailangang maging isang password na maaari mong matandaan kaya ang paggawa ay kasing kumplikado hangga't maaari. Narito ang isang random na generator ng password.

2238751 3
2238751 3

Hakbang 3. Lumikha ng isang talahanayan MySQL na pinangalanang "session"

Lumilikha ang code sa ibaba ng isang talahanayan na may 4 na mga patlang (id, set_time, data, session_key).

Lumikha ng talahanayan na "session":

GUMAWA NG TABLE `session` (` id` char (128) HINDI NULL, `set_time` char (10) HINDI NULL,` data` text HINDI NULL, `session_key` char (128) HINDI KUMUSTA, PANGUNAHING SUSI (` id`)) ENGINE = InnoDB DEFAULT CHARSET = latin1;

Ginagamit namin ang CHAR datatype para sa mga patlang na alam namin ang haba ng, dahil ang mga patlang na "id" at "session_key" ay laging 128 character ang haba. Ang paggamit ng CHAR dito ay nakakatipid sa lakas ng pagpoproseso.

Paraan 2 ng 3: Lumikha ng session.class.php file

2238751 4
2238751 4

Hakbang 1. Lumikha ng Klase

Upang magsimula ng isang bagong klase kakailanganin mong ipasok ang code sa ibaba:

Bagong Klase:

sesyon ng klase {

2238751 5
2238751 5

Hakbang 2. Lumikha ng pagpapaandar ng _construct

Tatawagan ang pagpapaandar na ito sa tuwing lumikha kami ng isang bagong halimbawa ng isang bagay gamit ang klase ng 'session'. Maaari mong basahin ang pag-andar ng PHP _construct dito.

Itinatakda ng pagpapaandar na ito ang aming pasadyang tagapamahala ng sesyon kaya magagamit ito para magamit sa lalong madaling panahon na ang klase ay instantiated (ibig sabihin, ginawa / itinayo / naitayo).

_construct function:

pagpapaandar _construct () {// itakda ang aming mga pag-andar ng pasadyang sesyon. session_set_save_handler (array ($ this, 'open'), array ($ this, 'close'), array ($ this, 'read'), array ($ this, 'write'), array ($ this, 'destroy'), array ($ ito, 'gc')); // Ang linya na ito ay pumipigil sa mga hindi inaasahang epekto kapag gumagamit ng mga bagay bilang mga save handler. register_shutdown_unction ('session_write_close'); }

2238751 6
2238751 6

Hakbang 3. Lumikha ng pagpapaandar ng start_session

Tatawagan ang pagpapaandar na ito sa tuwing nais mong magsimula ng isang bagong sesyon, gamitin ito sa halip na session_start ();. Tingnan ang mga komento sa code upang makita kung ano ang ginagawa ng bawat linya.

pagpapaandar ng start_session:

function na start_session ($ session_name, $ secure) {// Tiyaking hindi maa-access ang session cookie sa pamamagitan ng javascript. $KHponly = totoo; // Hash algorithm na gagamitin para sa session. (gumamit ng hash_algos () upang makakuha ng isang listahan ng mga magagamit na hash.) $ session_hash = 'sha512'; // Suriin kung magagamit ang hash kung (in_array ($ session_hash, hash_algos ())) {// Itakda ang may pagpapaandar. ini_set ('session.hash_unction', $ session_hash); } // Ilan ang bawat piraso ng character ng hash. // Ang mga posibleng halaga ay '4' (0-9, a-f), '5' (0-9, a-v), at '6' (0-9, a-z, A-Z, "-", ","). ini_set ('session.hash_bits_per_character', 5); // Pilitin ang session na gumamit lamang ng cookies, hindi mga variable ng URL. ini_set ('session.use_only_cookies', 1); // Kumuha ng mga parameter ng cookie ng session $ cookieParams = session_get_cookie_params (); // Itakda ang mga parameter session_set_cookie_params ($ cookieParams ["habang buhay"], $ cookieParams ["path"], $ cookieParams ["domain"], $ secure, $uonponly); // Baguhin ang pangalan ng session session_name ($ session_name); // Ngayon cat namin simulan ang session session_start (); // Ang linya na ito ay nagbabago ng sesyon at tatanggalin ang luma. // Nagbubuo rin ito ng isang bagong key sa pag-encrypt sa database. session_regenerate_id (totoo); }

2238751 7
2238751 7

Hakbang 4. Lumikha ng bukas na pagpapaandar

Ang pagpapaandar na ito ay tatawagan ng mga sesyon ng PHP kapag nagsimula kami ng isang bagong sesyon, ginagamit namin ito upang magsimula ng isang bagong koneksyon sa database.

bukas na pag-andar:

buksan ang function () {$ host = 'localhost'; $ user = 'sec_user'; $ pass = 'eKcGZr59zAa2BEWU'; $ name = 'secure_sessions'; $ MySQL = bagong MySQL ($ host, $ user, $ pass, $ name); $ this-> db = $ mysqli; bumalik totoo; }

2238751 8
2238751 8

Hakbang 5. Lumikha ng malapit na pagpapaandar

Ang pagpapaandar na ito ay tatawagan kapag nais ng mga session na isara.

malapit na pag-andar:

function close () {$ this-> db-> close (); bumalik totoo; }

2238751 9
2238751 9

Hakbang 6. Lumikha ng function na basahin

Ang pagpapaandar na ito ay tatawagan ng PHP kapag sinubukan naming mag-access sa isang session halimbawa habang gumagamit kami ng echo $ _SESSION ['isang bagay'];. Dahil maaaring maraming mga tawag sa pagpapaandar na ito sa isang solong pahina, sinasamantala namin ang mga nakahandang pahayag, hindi lamang para sa seguridad ngunit para sa pagganap din. Naghahanda lang kami ng pahayag nang isang beses pagkatapos ay maisagawa namin ito nang maraming beses.

Na-decrypt din namin ang data ng session na naka-encrypt sa database. Gumagamit kami ng 256-bit na pag-encrypt ng AES sa aming mga session.

basahin ang pagpapaandar:

function read ($ id) {if (! isset ($ this-> read_stmt)) {$ this-> read_stmt = $ this-> db-> ihanda ("SELECT data MULA sa mga session SAAN id =? LIMIT 1"); } $ this-> read_stmt-> bind_param ('s', $ id); $ this-> read_stmt-> execute (); $ this-> read_stmt-> store_result (); $ this-> read_stmt-> bind_result ($ data); $ this-> read_stmt-> kunin (); $ key = $ this-> getkey ($ id); $ data = $ this-> i-decrypt ($ data, $ key); ibalik ang $ data; }

2238751 10
2238751 10

Hakbang 7. Lumikha ng function ng pagsulat

Ginagamit ang pagpapaandar na ito kapag nagtalaga kami ng isang halaga sa isang sesyon, halimbawa $ _SESSION ['something'] = 'ibang bagay';. Ang pagpapaandar ay naka-encrypt ang lahat ng data na naipasok sa database.

isulat ang pagpapaandar:

function magsulat ($ id, $ data) {// Kumuha ng natatanging key $ key = $ this-> getkey ($ id); // Encrypt the data $ data = $ this-> encrypt ($ data, $ key); $ oras = oras (); kung (! mag-isyu ($ ito-> w_stmt)) {$ this-> w_stmt = $ ito-> db-> ihanda ("GUSTO ANG MGA session (id, set_time, data, session_key) VALUES (?,?,?,?) "); } $ this-> w_stmt-> bind_param ('siss', $ id, $ time, $ data, $ key); $ ito-> w_stmt-> isakatuparan (); bumalik totoo; }

2238751 11
2238751 11

Hakbang 8. Lumikha ng pag-andar ng sirain

Ang pagpapaandar na ito ay tatanggalin ang sesyon mula sa database, ginagamit ito ng php kapag tumawag kami ng mga pagpapaandar tulad ng session_destroy ();.

sirain ang pagpapaandar:

pag-andar sirain ($ id) {kung (! maglabas ($ ito-> tanggalin_stmt)) {$ ito-> tanggalin_stmt = $ ito-> db-> ihanda ("TANGGALIN MULA SA mga session SAAN id =?"); } $ this-> delete_stmt-> bind_param ('s', $ id); $ ito-> tanggalin_stmt-> isagawa (); bumalik totoo; }

2238751 12
2238751 12

Hakbang 9. Lumikha ng pagpapaandar ng gc (basurero)

Ang pagpapaandar na ito ay ang pagpapaandar ng basura na tinatawag na ito upang tanggalin ang mga lumang session. Ang dalas kung saan tinawag ang pagpapaandar na ito ay natutukoy ng dalawang direktiba sa pagsasaayos, session.gc_probability at session.gc_divisor.

gc () pagpapaandar:

function gc ($ max) {if (! isyu ($ this-> gc_stmt)) {$ this-> gc_stmt = $ this-> db-> ihanda ("TANGGALIN MULA sa mga session SAAN itinakda ang oras <?"); } $ old = time () - $ max; $ this-> gc_stmt-> bind_param ('s', $ old); $ ito-> gc_stmt-> isakatuparan (); bumalik totoo; }

2238751 13
2238751 13

Hakbang 10. Lumikha ng pagpapaandar ng getKey

Ang pagpapaandar na ito ay ginagamit upang makuha ang natatanging susi para sa pag-encrypt mula sa talahanayan ng mga session. Kung walang sesyon ibabalik lamang nito ang isang bagong random key para sa pag-encrypt.

getkey () Pag-andar:

pribadong pag-andar getkey ($ id) {if (! isyu ($ this-> key_stmt)) {$ this-> key_stmt = $ this-> db-> ihanda ("SELECT session_key MULA SA mga session SAAN id =? LIMIT 1"); } $ this-> key_stmt-> bind_param ('s', $ id); $ ito-> key_stmt-> magpatupad (); $ this-> key_stmt-> store_result (); kung ($ this-> key_stmt-> num_rows == 1) {$ this-> key_stmt-> bind_result ($ key); $ this-> key_stmt-> kunin (); ibalik ang $ key; } iba pa {$ random_key = hash ('sha512', uniqid (mt_rand (1, mt_getrandmax ()), totoo)); ibalik ang $ random_key; }}

2238751 14
2238751 14

Hakbang 11. Lumikha ng mga function na naka-encrypt at i-decrypt

Ang mga pagpapaandar na ito ay naka-encrypt ng data ng mga session, gumagamit sila ng isang key ng pag-encrypt mula sa database na naiiba para sa bawat session. Hindi namin direktang ginagamit ang key na iyon sa pag-encrypt ngunit ginagamit namin ito upang gawing mas random ang key hash.

mga function na naka-encrypt () at i-decrypt ():

naka-encrypt na pribadong pag-andar ($ 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); $ naka-encrypt = base64_encode (mcrypt_encrypt (MCRYPT_RIJNDAEL_256, $ key, $ data, MCRYPT_MODE_ECB, $ iv)); ibalik ang naka-encrypt na $; } pribadong pag-decrypt ng pag-andar ($ 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, $ key, base64_decode ($ data), MCRYPT_MODE_ECB, $ iv); $ decrypted = rtrim ($ decrypted, "\ 0"); ibalik ang $ decrypted; }

2238751 15
2238751 15

Hakbang 12. Pagtatapos ng Klase

Dito lamang natatapos ang mga klase naming kulot na mga braket:

Pagtatapos ng Klase:

}

Paraan 3 ng 3: Paglikha ng Mga Pahina Sa Mga Session

2238751 16
2238751 16

Hakbang 1. Paggamit ng mga sesyon sa tagapamahala ng pasadyang sesyon

Nasa ibaba kung paano ka magsisimulang isang bagong sesyon; kakailanganin mong isama ito sa bawat pahina na nais mong i-access ang mga session, gamitin ito sa halip na session_start ();

Simula sa isang sesyon:

nangangailangan ng ('session.class.php'); $ session = bagong session (); // Itakda sa totoo kung gumagamit ng https $ session-> start_session ('_ s', false); $ _SESSION ['something'] = 'Isang halaga.'; echo $ _SESSION ['isang bagay'];

Inirerekumendang: