3 způsoby, jak vytvořit bezpečný systém pro správu relací v PHP a MySQL

Obsah:

3 způsoby, jak vytvořit bezpečný systém pro správu relací v PHP a MySQL
3 způsoby, jak vytvořit bezpečný systém pro správu relací v PHP a MySQL

Video: 3 způsoby, jak vytvořit bezpečný systém pro správu relací v PHP a MySQL

Video: 3 způsoby, jak vytvořit bezpečný systém pro správu relací v PHP a MySQL
Video: How to Become a FULL TIME Web Designer | Full Guide 2023 2024, Duben
Anonim

Tato příručka vám ukáže, jak můžete své relace bezpečně ukládat do databáze mySQL. Rovněž zašifrujeme všechna data relací, která jdou do databáze, což znamená, že pokud se někomu podaří hacknout do databáze, všechna data relace jsou šifrována 256bitovým šifrováním AES.

Kroky

Metoda 1 ze 3: Konfigurace databáze mySQL

2238751 1
2238751 1

Krok 1. Vytvořte databázi MySQL

V této příručce vytvoříme databázi s názvem „secure_sessions“.

Podívejte se, jak vytvořit databázi v phpMyAdmin.

Nebo můžete použít níže uvedený kód SQL, který vám vytvoří.

Vytvořit kód databáze:

VYTVOŘIT DATABÁZI `secure_sessions`;

Poznámka: Některé hostingové služby vám neumožňují vytvořit databázi pomocí phpMyAdmin, přečtěte si, jak to udělat v cPanel.

2238751 2
2238751 2

Krok 2. Vytvořte uživatele, který má pouze oprávnění SELECT, INSERT a DELETE

To znamená, že pokud někdy došlo k narušení zabezpečení našeho skriptu, hacker nemohl odstranit tabulky z naší databáze. Pokud jste opravdu paranoidní, vytvořte pro každou funkci jiného uživatele.

  • Uživatel:

    "sec_user"

  • Heslo:

    "eKcGZr59zAa2BEWU"

Vytvořit uživatelský kód:

VYTVOŘIT UŽIVATELE 'sec_user'@'localhost' IDENTIFIKOVANÉ 'eKcGZr59zAa2BEWU'; VYBRAT VÝBĚR, VLOŽIT, AKTUALIZOVAT, SMAZAT NA `secure_sessions`.* TO 'sec_user'@'localhost';

Poznámka: Při spuštění na vlastním serveru je dobré změnit heslo v kódu výše. (Nezapomeňte také změnit kód PHP.) Pamatujte si, že to nemusí být heslo, které si můžete pamatovat, takže tvorba je co nejsložitější. Zde je generátor náhodných hesel.

2238751 3
2238751 3

Krok 3. Vytvořte tabulku MySQL s názvem „sessions“

Níže uvedený kód vytvoří tabulku se 4 poli (id, set_time, data, session_key).

Vytvořte tabulku „relace“:

CREATE TABLE `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;

Datový typ CHAR používáme pro pole, jejichž délku známe, protože pole „id“a „session_key“budou mít vždy 128 znaků. Použití CHAR zde šetří výpočetní výkon.

Metoda 2 ze 3: Vytvořte soubor session.class.php

2238751 4
2238751 4

Krok 1. Vytvořte třídu

Chcete -li začít novou třídu, budete muset zadat níže uvedený kód:

Nová třída:

třídní sezení {

2238751 5
2238751 5

Krok 2. Vytvořte funkci _construct

Tato funkce bude volána pokaždé, když vytvoříme novou instanci objektu pomocí třídy 'session'. Zde si můžete přečíst o funkci PHP _construct.

Tato funkce nastavuje náš vlastní obslužný program relací, takže je k dispozici pro použití ihned po vytvoření instance třídy (tj. Vyrobeno/postaveno/vyrobeno).

Funkce _construct:

function _construct () {// nastavení našich vlastních funkcí relace. session_set_save_handler (array ($ this, 'open'), array ($ this, 'close'), array ($ this, 'read'), array ($ this, 'write'), array ($ this, 'destru'), pole ($ this, 'gc')); // Tento řádek zabraňuje neočekávaným efektům při použití objektů jako obslužných programů pro ukládání. register_shutdown_function ('session_write_close'); }

2238751 6
2238751 6

Krok 3. Vytvořte funkci start_session

Tato funkce bude volána pokaždé, když chcete zahájit novou relaci, použijte ji místo session_start ();. Podívejte se na komentáře v kódu, abyste zjistili, co každý řádek dělá.

funkce start_session:

funkce start_session ($ session_name, $ secure) {// Zajistěte, aby soubor cookie relace nebyl přístupný pomocí JavaScriptu. $ httponly = true; // Algoritmus hash, který se má použít pro relaci. (použijte hash_algos () k získání seznamu dostupných hashů.) $ session_hash = 'sha512'; // Zkontrolujte, zda je k dispozici hash if (in_array ($ session_hash, hash_algos ())) {// Nastavte funkci has. ini_set ('session.hash_function', $ session_hash); } // Kolik bitů na znak hash. // Možné hodnoty jsou '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); // Vynutit relaci používat pouze soubory cookie, nikoli proměnné adresy URL. ini_set ('session.use_only_cookies', 1); // Získejte parametry cookie relace $ cookieParams = session_get_cookie_params (); // Nastavte parametry session_set_cookie_params ($ cookieParams ["životnost"], $ cookieParams ["cesta"], $ cookieParams ["doména"], $ bezpečný, $ httponly); // Změňte název relace session_name ($ session_name); // Nyní zahájíme relaci session_start (); // Tento řádek regeneruje relaci a odstraní starou. // Rovněž generuje nový šifrovací klíč v databázi. session_regenerate_id (true); }

2238751 7
2238751 7

Krok 4. Vytvořte otevřenou funkci

Tuto funkci budou volat relace PHP, když spustíme novou relaci, použijeme ji ke spuštění nového připojení k databázi.

otevřená funkce:

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

2238751 8
2238751 8

Krok 5. Vytvořte funkci zavření

Tato funkce bude volána, když se relace chtějí zavřít.

zavřít funkci:

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

2238751 9
2238751 9

Krok 6. Vytvořte funkci čtení

Tuto funkci zavolá PHP, když se pokusíme přistoupit k relaci, například když použijeme echo $ _SESSION ['something'];. Protože na této stránce může být mnoho volání této funkce, využíváme výhod připravených příkazů, a to nejen z důvodu zabezpečení, ale také kvůli výkonu. Výpis připravíme pouze jednou, poté jej můžeme provést mnohokrát.

Také dešifrujeme data relace, která jsou šifrována v databázi. V našich relacích používáme 256bitové šifrování AES.

funkce čtení:

funkce read ($ id) {if (! isset ($ this-> read_stmt)) {$ this-> read_stmt = $ this-> db-> preparation ("SELECT data FROM sessions 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 ($ data); $ this-> read_stmt-> fetch (); $ key = $ this-> getkey ($ id); $ data = $ this-> dešifrovat ($ data, $ klíč); vrátit $ data; }

2238751 10
2238751 10

Krok 7. Vytvořte funkci zápisu

Tato funkce se používá, když relaci přiřadíme hodnotu, například $ _SESSION ['something'] = 'something else';. Funkce šifruje všechna data, která se vloží do databáze.

zapisovací funkce:

zápis funkce ($ id, $ data) {// Získejte jedinečný klíč $ klíč = $ this-> getkey ($ id); // Šifrování dat $ data = $ this-> šifrování ($ data, $ klíč); $ čas = čas (); if (! isset ($ this-> w_stmt)) {$ this-> w_stmt = $ this-> db-> preparation ("REPLACE INTO sessions (id, set_time, data, session_key) VALUES (?,?,?,?) "); } $ this-> w_stmt-> bind_param ('siss', $ id, $ time, $ data, $ key); $ this-> w_stmt-> execute (); return true; }

2238751 11
2238751 11

Krok 8. Vytvořte funkci zničení

Tato funkce odstraní relaci z databáze, používá ji php, když voláme funkce jako session_destroy ();.

zničit funkci:

funkce zničit ($ id) {if (! isset ($ this-> delete_stmt)) {$ this-> delete_stmt = $ this-> db-> preparation ("DELETE FROM sessions WHERE id =?"); } $ this-> delete_stmt-> bind_param ('s', $ id); $ this-> delete_stmt-> execute (); return true; }

2238751 12
2238751 12

Krok 9. Vytvořte funkci gc (garbage collector)

Tato funkce je funkce garbage collector, která se nazývá k odstranění starých relací. Frekvence, ve které je tato funkce volána, je určena dvěma konfiguračními směrnicemi, session.gc_probability a session.gc_divisor.

funkce gc ():

funkce gc ($ max) {if (! isset ($ this-> gc_stmt)) {$ this-> gc_stmt = $ this-> db-> připravit ("ODSTRANIT Z relací KDE set_time <?"); } $ old = čas () - $ max; $ this-> gc_stmt-> bind_param ('s', $ old); $ this-> gc_stmt-> execute (); return true; }

2238751 13
2238751 13

Krok 10. Vytvořte funkci getKey

Tato funkce slouží k získání jedinečného klíče pro šifrování z tabulky relací. Pokud není relace, vrátí pouze nový náhodný klíč pro šifrování.

getkey () Funkce:

soukromá funkce 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átit $ klíč; } else {$ random_key = hash ('sha512', uniqid (mt_rand (1, mt_getrandmax ()), true)); vrátit $ random_key; }}

2238751 14
2238751 14

Krok 11. Vytvořte funkce šifrování a dešifrování

Tyto funkce šifrují data relací, používají šifrovací klíč z databáze, který je pro každou relaci jiný. Tento klíč v šifrování přímo nepoužíváme, ale používáme ho, aby byl hash klíče ještě více náhodný.

funkce encrypt () a decrypt ():

šifrování soukromé funkce ($ data, $ klíč) {$ 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átit $ zašifrováno; } dešifrování soukromé funkce ($ data, $ klíč) {$ 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šifrováno = mcrypt_decrypt (MCRYPT_RIJNDAEL_256, $ klíč, base64_decode ($ data), MCRYPT_MODE_ECB, $ iv); $ decrypted = rtrim ($ dešifrováno, "\ 0"); vrátit $ dešifrovaný; }

2238751 15
2238751 15

Krok 12. Ukončete třídu

Zde ukončujeme složené závorky tříd:

Koncová třída:

}

Metoda 3 ze 3: Vytváření stránek s relacemi

2238751 16
2238751 16

Krok 1. Použití relací s vlastním správcem relací

Níže je uvedeno, jak byste zahájili novou relaci; budete to muset zahrnout na každou stránku, ke které chcete mít přístup k relacím, použijte místo session_start ();

Zahájení relace:

require ('session.class.php'); $ session = nová relace (); // Nastaveno na true, pokud používáte https $ session-> start_session ('_ s', false); $ _SESSION ['something'] = 'Hodnota.'; echo $ _SESSION ['něco'];

Doporučuje: