3 spôsoby, ako vytvoriť bezpečný systém riadenia relácií v PHP a MySQL

Obsah:

3 spôsoby, ako vytvoriť bezpečný systém riadenia relácií v PHP a MySQL
3 spôsoby, ako vytvoriť bezpečný systém riadenia relácií v PHP a MySQL

Video: 3 spôsoby, ako vytvoriť bezpečný systém riadenia relácií v PHP a MySQL

Video: 3 spôsoby, ako vytvoriť bezpečný systém riadenia relácií v PHP a MySQL
Video: Quiet House, Time to Chat! Topics: Crochet (always), Designaversary, WordPress Migration 2024, Apríl
Anonim

Táto príručka vám ukáže, ako môžete svoje relácie bezpečne uložiť do databázy mySQL. Tiež zašifrujeme všetky údaje o reláciách, ktoré idú do databázy, čo znamená, že ak sa niekomu podarí preniknúť do databázy, všetky údaje o relácii budú šifrované 256-bitovým šifrovaním AES.

Kroky

Metóda 1 z 3: Konfigurácia databázy mySQL

2238751 1
2238751 1

Krok 1. Vytvorte databázu MySQL

V tejto príručke vytvoríme databázu s názvom „secure_sessions“.

Pozrite sa, ako vytvoriť databázu v phpMyAdmin.

Alebo môžete použiť nižšie uvedený kód SQL, ktorý vám ho vytvorí.

Vytvorte kód databázy:

VYTVORIŤ DATABÁZU `secure_sessions`;

Poznámka: Niektoré hostiteľské služby vám neumožňujú vytvoriť databázu pomocou phpMyAdmin, prečítajte si, ako to urobiť v programe cPanel.

2238751 2
2238751 2

Krok 2. Vytvorte používateľa s iba oprávneniami SELECT, INSERT a DELETE

To znamená, že ak dôjde k narušeniu zabezpečenia nášho skriptu, hacker nemôže odstrániť tabuľky z našej databázy. Ak ste skutočne paranoidní, vytvorte pre každú funkciu iného používateľa.

  • Užívateľ:

    "sec_user"

  • Heslo:

    "eKcGZr59zAa2BEWU"

Vytvoriť užívateľský kód:

VYTVORIŤ UŽÍVATEĽA 'sec_user'@'localhost' IDENTIFIKOVANÉ 'eKcGZr59zAa2BEWU'; GRANT VÝBER, VLOŽIŤ, AKTUALIZOVAŤ, VYMAZAŤ NA `secure_sessions`.* TO 'sec_user'@'localhost';

Poznámka: Pri spustení na vlastnom serveri je vhodné zmeniť heslo v kóde uvedenom vyššie. (Uistite sa, že zmeníte aj svoj kód PHP.) Pamätajte si, že to nemusí byť heslo, ktoré si môžete pamätať, takže výroba je čo najkomplikovanejšia. Tu je generátor náhodných hesiel.

2238751 3
2238751 3

Krok 3. Vytvorte tabuľku MySQL s názvom „sessions“

Nasledujúci kód vytvára tabuľku so 4 poľami (id, set_time, data, session_key).

Vytvorte tabuľku „relácií“:

VYTVORIŤ TABUĽKU `sessions` (` 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 = VÝCHOZÍ CHARSET InnoDB = latin1;

Dátový typ CHAR používame pre polia, ktorých dĺžku poznáme, pretože polia „id“a „session_key“budú mať vždy 128 znakov. Použitie CHAR tu šetrí výpočtový výkon.

Metóda 2 z 3: Vytvorte súbor session.class.php

2238751 4
2238751 4

Krok 1. Vytvorte triedu

Na začatie novej triedy budete potrebovať nasledujúci kód:

Nová trieda:

triedna relácia {

2238751 5
2238751 5

Krok 2. Vytvorte funkciu _construct

Táto funkcia sa bude volať vždy, keď vytvoríme novú inštanciu objektu pomocou triedy 'session'. Tu si môžete prečítať o funkcii PHP _construct.

Táto funkcia nastavuje náš vlastný obslužný program relácií, takže je k dispozícii na použitie ihneď po vytvorení triedy (tj.

Funkcia _construct:

function _construct () {// nastavte naše vlastné funkcie relácie. session_set_save_handler (pole ($ this, 'open'), array ($ this, 'close'), array ($ this, 'read'), array ($ this, 'write'), array ($ this, 'destru'), pole ($ this, 'gc')); // Tento riadok zabraňuje neočakávaným efektom pri použití objektov ako obslužných programov ukladania. register_shutdown_function ('session_write_close'); }

2238751 6
2238751 6

Krok 3. Vytvorte funkciu start_session

Táto funkcia sa bude volať vždy, keď chcete začať novú reláciu, použite ju namiesto session_start ();. Pozrite sa na komentáre v kóde, aby ste zistili, čo jednotlivé riadky robia.

funkcia start_session:

funkcia start_session ($ session_name, $ secure) {// Uistite sa, že súbor cookie relácie nie je prístupný prostredníctvom JavaScriptu. $ httponly = true; // Algoritmus hash, ktorý sa má použiť pre reláciu. (použite hash_algos () na získanie zoznamu dostupných hashov.) $ session_hash = 'sha512'; // Skontrolujte, či je hash k dispozícii, ak (in_array ($ session_hash, hash_algos ())) {// Nastavte funkciu has. ini_set ('session.hash_function', $ session_hash); } // Koľko bitov na znak hash. // Možné hodnoty sú '4' (0-9, a-f), '5' (0-9, a-v) a '6' (0-9, a-z, A-Z, "-", ","). ini_set ('session.hash_bits_per_character', 5); // Vynútite, aby relácia používala iba súbory cookie, nie premenné adresy URL. ini_set ('session.use_only_cookies', 1); // Získať parametre cookie relácie $ cookieParams = session_get_cookie_params (); // Nastavte parametre session_set_cookie_params ($ cookieParams ["životnosť"], $ cookieParams ["cesta"], $ cookieParams ["doména"], $ bezpečný, $ httponly); // Zmeňte názov relácie session_name ($ session_name); // Teraz začneme reláciu session_start (); // Tento riadok regeneruje reláciu a odstráni starú. // Tiež generuje nový šifrovací kľúč v databáze. session_regenerate_id (true); }

2238751 7
2238751 7

Krok 4. Vytvorte otvorenú funkciu

Túto funkciu budú volať relácie PHP, keď spustíme novú reláciu, použijeme ju na spustenie nového databázového pripojenia.

otvorená funkcia:

funkcia open () {$ host = 'localhost'; $ user = 'sec_user'; $ pass = 'eKcGZr59zAa2BEWU'; $ name = 'secure_sessions'; $ mysqli = new mysqli ($ host, $ user, $ pass, $ name); $ this-> db = $ mysqli; návrat true; }

2238751 8
2238751 8

Krok 5. Vytvorte funkciu zatvorenia

Táto funkcia sa vyvolá, keď sa chcú relácie ukončiť.

zatváracia funkcia:

funkcia close () {$ this-> db-> close (); návrat true; }

2238751 9
2238751 9

Krok 6. Vytvorte funkciu čítania

Túto funkciu zavolá PHP, keď sa pokúsime získať prístup k relácii, napríklad keď použijeme echo $ _SESSION ['niečo'];. Pretože na túto stránku môže byť veľa volaní k tejto funkcii, využívame pripravené vyhlásenia nielen z hľadiska zabezpečenia, ale aj z hľadiska výkonu. Výpis pripravíme iba raz, potom ho môžeme mnohokrát vykonať.

Dešifrujeme tiež údaje relácie, ktoré sú šifrované v databáze. V našich reláciách používame 256-bitové šifrovanie AES.

funkcia čítania:

funkcia čítať ($ id) {if (! isset ($ this-> read_stmt)) {$ this-> read_stmt = $ this-> db-> pripraviť ("VYBERTE údaje z relácií KDE id =? OMEZIŤ 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-> fetch (); $ key = $ this-> getkey ($ id); $ data = $ this-> dešifrovať ($ data, $ kľúč); vrátiť $ dáta; }

2238751 10
2238751 10

Krok 7. Vytvorte funkciu zápisu

Táto funkcia sa používa, keď relácii priradíme hodnotu, napríklad $ _SESSION ['niečo'] = 'niečo iné';. Táto funkcia šifruje všetky údaje, ktoré sa vložia do databázy.

funkcia zápisu:

funkcia write ($ id, $ data) {// Získať jedinečný kľúč $ key = $ this-> getkey ($ id); // Šifrovanie údajov $ data = $ this-> zašifrovať ($ dáta, $ kľúč); $ cas = cas (); if (! isset ($ this-> w_stmt)) {$ this-> w_stmt = $ this-> db-> prepar („REPLACE INTO sessions (id, set_time, data, session_key) VALUES (?,?,?,?) "); } $ this-> w_stmt-> bind_param ('siss', $ id, $ time, $ data, $ key); $ this-> w_stmt-> execute (); návrat true; }

2238751 11
2238751 11

Krok 8. Vytvorte funkciu zničenia

Táto funkcia vymaže reláciu z databázy, používa ju php, keď voláme funkcie ako session_destroy ();.

zničiť funkciu:

zničiť funkciu ($ id) {if (! isset ($ this-> delete_stmt)) {$ this-> delete_stmt = $ this-> db-> připravit ("ODSTRÁNIŤ Z relácií KDEŽ id =?"); } $ this-> delete_stmt-> bind_param ('s', $ id); $ this-> delete_stmt-> execute (); návrat true; }

2238751 12
2238751 12

Krok 9. Vytvorte funkciu gc (garbage collector)

Táto funkcia je funkciou zberača odpadu, ktorá sa nazýva odstránenie starých relácií. Frekvencia, v ktorej sa táto funkcia volá, je určená dvoma konfiguračnými smernicami, session.gc_probability a session.gc_divisor.

gc () funkcia:

funkcia gc ($ max) {if (! isset ($ this-> gc_stmt)) {$ this-> gc_stmt = $ this-> db-> pripraviť ("ODSTRÁNIŤ Z relácií, KDE set_time <?"); } $ old = čas () - $ max; $ this-> gc_stmt-> bind_param ('s', $ old); $ this-> gc_stmt-> execute (); návrat true; }

2238751 13
2238751 13

Krok 10. Vytvorte funkciu getKey

Táto funkcia sa používa na získanie jedinečného kľúča na šifrovanie z tabuľky relácií. Ak neexistuje žiadna relácia, vráti iba nový náhodný kľúč na šifrovanie.

getkey () Funkcia:

súkromná funkcia getkey ($ id) {if (! isset ($ this-> key_stmt)) {$ this-> key_stmt = $ this-> db-> preparation ("SELECT session_key FROM sessions 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 (); vrátiť kľúč $; } else {$ random_key = hash ('sha512', uniqid (mt_rand (1, mt_getrandmax ()), true)); vrátiť $ random_key; }}

2238751 14
2238751 14

Krok 11. Vytvorte funkcie šifrovania a dešifrovania

Tieto funkcie šifrujú údaje relácií, používajú šifrovací kľúč z databázy, ktorý je pre každú reláciu iný. Tento kľúč priamo nepoužívame pri šifrovaní, ale používame ho na to, aby bola hash kľúča ešte náhodnejšia.

funkcie encrypt () a decrypt ():

šifrovanie súkromnej funkcie ($ dáta, $ kľúč) {$ 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, $ key, $ data, MCRYPT_MODE_ECB, $ iv)); vrátiť šifrované $; } dešifrovanie súkromnej funkcie ($ data, $ kľúč) {$ 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); $ dešifrovaný = mcrypt_decrypt (MCRYPT_RIJNDAEL_256, $ kľúč, base64_decode ($ dáta), MCRYPT_MODE_ECB, $ iv); $ dešifrovaný = rtrim ($ dešifrovaný, "\ 0"); vrátiť $ dešifrovaný; }

2238751 15
2238751 15

Krok 12. Ukončite triedu

Tu končíme zložené zátvorky tried:

Koniec triedy:

}

Metóda 3 z 3: Vytváranie stránok pomocou relácií

2238751 16
2238751 16

Krok 1. Použitie relácií s vlastným správcom relácií

Nasleduje spôsob, akým by ste začali novú reláciu; budete to musieť zahrnúť na každú stránku, na ktorú chcete mať prístup k reláciám, použite ho namiesto session_start ();

Spustenie relácie:

require ('session.class.php'); $ session = nová relácia (); // Nastavte na hodnotu true, ak používate https $ session-> start_session ('_ s', false); $ _SESSION ['something'] = 'Hodnota.'; echo $ _SESSION ['niečo'];

Odporúča: