Sådan oprettes et sikkert sessionsstyringssystem i php og mysql

Denne vejledning viser dig, hvordan du kan gemme dine sessioner sikkert i en MySQL-database. Vi vil også kryptere alle sessionsdata, der går ind i databasen, hvilket betyder, at hvis nogen klarer at hakke ind i databasen, er alle sessionsdata krypteret med 256-bit AES-kryptering.

Trin

Metode 1 af 3:
Konfigurer MySQL-databasen
  1. Billede med titlen 2238751 1
1. Opret en MySQL-database.
I denne vejledning opretter vi en database kaldet "Secure_sessions".
Se hvordan CREATE-A-DATABASE-IN-PHPMYADMIN.
Eller du kan bruge SQL-koden nedenfor, vil oprette en til dig.

Opret databasekode:
Opret database `secure_sessions` -
Bemærk: Nogle hosting-tjenester giver dig ikke mulighed for at oprette en database via phpmyadmin, lære at gøre det i cpanel.
  • Billede med titlen 2238751 2
    2. Opret en bruger med kun Vælg, Indsæt og Slet privilegier.
    Det betyder, at hvis der nogensinde var et brud på sikkerhed i vores script, kunne hacker ikke falde tabeller fra vores database.Hvis du er virkelig paranoid, skal du oprette en anden bruger for hver funktion.

  • Bruger: "sec_user"
  • Adgangskode: "EKCGZR59ZAA2BEWU"


  • Opret brugerkode:
    Opret bruger `Sec_user` @ `LocalHost`, der er identificeret med `EKCGZR59ZAA2BEWU`-Grant Vælg, Indsæt, Opdater, Slet på `Secure_sessions`.* Til `sec_user` @ `localhost`-

    Bemærk: Det er en god ide at ændre adgangskoden i koden ovenfor, når du kører på din egen server. (Sørg for, at du også ændrer din PHP-kode.) Husk, at det ikke behøver at være et kodeord, som du kan huske, så gør, er så kompliceret som muligt. Her er A Tilfældig adgangskode generator.
  • Billede med titlen 2238751 3
    3. Opret en MySQL-bord ved navn "sessioner".
    Koden nedenfor opretter et bord med 4 felter (id, set_time, data, session_key).

    Opret "sessioner" bord:
    Opret bord `sessioner` (` ID` char (128) ikke null, `set_time` char (10) ikke null,` Data` Text ikke null, `session_key` char (128) ikke null, primærnøgle (` ID`) ) Motor = Innodb Standard charset = Latin1-
    Vi bruger Char DataType til felter, vi kender længden af, som felterne "ID" og "session_key" vil altid være 128 tegn lang. Brug af Char her sparer på behandlingskraft.
  • Metode 2 af 3:
    Opret session.klasse.PHP-fil
    1. Billede med titlen 2238751 4
    1. Opret klasse.
    For at starte en ny klasse skal du indtaste koden nedenfor:

    Ny klasse:
    Klasse session {
  • Billede med titlen 2238751 5
    2. Opret __Construct-funktion.
    Denne funktion vil blive kaldt hver gang vi opretter en ny forekomst af et objekt ved hjælp af `session` klasse. Du kan læse på PHP __Construct-funktionen her.
    Denne funktion angiver vores brugerdefinerede sessionshåndterer, så den er tilgængelig til brug, så snart klassen er instantiated (i.E., lavet / bygget / konstrueret).

    __Construct-funktion:
    Funktion __Construct () {// Indstil vores brugerdefinerede sessionsfunktioner.session_set_save_handler (array ($ dette, `Open`), array ($ dette, `close`), array ($ dette, `læst`), array ($ dette, `skriv`), array ($ dette, `ødelægge` ), Array ($ dette, `GC`)) - // Denne linje forhindrer uventede virkninger, når du bruger objekter som gemme håndtere.register_shutdown_function (`session_write_close`) -}
  • Billede med titlen 2238751 6
    3. Opret start_session funktion.
    Denne funktion vil blive kaldt hver gang du vil starte en ny session, skal du bruge den i stedet for Session_start ()-. Se kommentarerne i koden for at se, hvad hver linje gør.

    START_SESSION FUNKTION:
    FUNKTION START_SESSION ($ SESSION_NAME, $ SIKKER) {// Sørg for, at session cookie ikke er tilgængelig via jаvascript.$ httponly = true - // hash algorithm at bruge til sessionen. (brug hash_algos () for at få en liste over tilgængelige hash.) $ session_hash = `sha512` - // check om hash er tilgængelig (in_array ($ session_hash, hash_algos ())) {// Set den har funktion.ini_set (`session.hash_function `, $ session_hash) -} // hvor mange bits per karakter af hash.// De mulige værdier er `4` (0-9, A-F), `5` (0-9, A-V) og `6` (0-9, A-Z, A-Z, "-", ",").ini_set (`session.hash_bits_per_character `, 5) - // Force sessionen til kun at bruge cookies, ikke urlvariabler.ini_set (`session.brug_only_cookies `, 1) - // få session cookie parametre $ cookiearams = session_get_cookie_params () - // Indstil parameterssession_Set_cookie_params ($ CookieParams ["livstid"], $ cookiearams ["sti"], $ cookiearams ["domæne"], $ Secure, $ httponly) - // ændre sessionsnavnet session_name ($ session_name) - // nu vi kat starter sessionssession_start () - // denne linje regenererer sessionen og slet den gamle. // Det genererer også en ny krypteringsnøgle i databasen. session_regenerate_id (true) -}
  • Billede med titlen 2238751 7
    4. Opret åben funktion.
    Denne funktion vil blive kaldt af PHP-sessioner, når vi starter en ny session, bruger vi den til at starte en ny databaseforbindelse.

    Åben funktion:
    funktion åben () {$ host = `localhost` - $ user = `sec_user` - $ pass = `eKcgzr59zaa2bewu` - $ navn = `secure_sessions` - $ mySqli = New MySQLI ($ Host, $ User, $ Pass, $ Navn ) - $ dette->DB = $ MySQLI-RETURN TRUE-}
  • Billede med titlen 2238751 8
    5. Opret tæt funktion.
    Denne funktion vil blive kaldt, når sessionerne vil blive lukket.

    Luk funktion:
    Funktion tæt () {$ dette->db->Luk () - Return True-}
  • Billede med titlen 2238751 9
    6. Opret læsningsfunktion.
    Denne funktion vil blive kaldt af PHP, når vi forsøger at få adgang til en session, for eksempel når vi bruger ekko $ _session [`noget`]-. Fordi der kan være mange opkald til denne funktion på en enkelt side, drager vi fordel af forberedte udsagn, ikke kun for sikkerhed, men for ydeevne også. Vi forbereder kun erklæringen en gang, så vi kan udføre det mange gange.
    Vi dekrypterer også sessionsdataene, der er krypteret i databasen. Vi bruger 256-bit AES-kryptering i vores sessioner.

    Læs funktion:
    Funktion Læs ($ ID) {IF (!ISSET ($ dette->read_stmt)) {$ dette->read_stmt = $ dette->db->forberede("Vælg data fra sessioner, hvor ID = ? Begræns 1") -} $ dette->read_stmt->bind_param (`s`, $ id) - $ dette->read_stmt->Udfør () - $ dette->read_stmt->store_result () - $ dette->read_stmt->BIND_RESULT ($ DATA) - $ Dette->read_stmt->Hent () - $ Key = $ dette->gety ($ ID) - $ Data = $ dette->dekryptere ($ data, $ nøgle) -return $ data-}
  • Billede med titlen 2238751 10
    7. Opret skrivefunktion.
    Denne funktion bruges, når vi tildeler en værdi til en session, for eksempel $ _Session [`noget`] = `Noget andet`-. Funktionen krypterer alle de data, der bliver indsat i databasen.

    Skriv funktion:
    Funktion Skriv ($ ID, $ Data) {// Get Unique Key $ Key = $ dette->gety ($ ID) - // Krypter dataene $ Data = $ dette->Krypter ($ Data, $ Key) - $ time = tid () - hvis (!ISSET ($ dette->w_stmt)) {$ dette->w_stmt = $ dette->db->forberede("Erstatte i sessioner (ID, set_time, data, session_key) værdier (?, ?, ?, ?)") -} $ dette->w_stmt->BIND_PARAM (`SISS`, $ ID, $ TID, $ DATA, $ KEY) - $ Dette->w_stmt->Udfør () - Return True-}
  • Billede med titlen 2238751 11
    8. Opret ødelægge funktion.
    Denne funktion sletter sessionen fra databasen, den bruges af PHP, når vi ringer til funktioner som Session__Destroy ()-.

    Destroy funktion:
    funktion ødelægger ($ id) {hvis (!ISSET ($ dette->DELETE_STMT)) {$ dette->DELETE_STMT = $ Dette->db->forberede("Slet fra sessioner, hvor ID = ?") -} $ dette->DELETE_STMT->bind_param (`s`, $ id) - $ dette->DELETE_STMT->Udfør () - Return True-}
  • Billede med titlen 2238751 12
    9. Opret GC (Garbage Collector) funktion.
    Denne funktion er Garbage Collector-funktionen, den kaldes for at slette gamle sessioner. Den frekvens, hvor denne funktion kaldes, bestemmes af to konfigurationsdirektiver, session.GC_PROBABILITY OG SESSION.gc_divisor.

    GC () Funktion:
    Funktion GC ($ Max) {IF (!ISSET ($ dette->gc_stmt)) {$ dette->gc_stmt = $ dette->db->forberede("Slet fra sessioner, hvor set_time < ?") -} $ old = tid () - $ max- $ dette->gc_stmt->bind_param (`s`, $ old) - $ dette->gc_stmt->Udfør () - Return True-}
  • Billede med titlen 2238751 13
    10. Opret getkey funktion.
    Denne funktion bruges til at få den unikke nøgle til kryptering fra sessionens tabel. Hvis der ikke er nogen session, returnerer det bare en ny tilfældig nøgle til kryptering.

    gety () funktion:
    Privat Funktion GetKey ($ ID) {IF (!ISSET ($ dette->key_stmt)) {$ dette->key_stmt = $ dette->db->forberede("Vælg session_key fra sessioner, hvor ID = ? Begræns 1") -} $ dette->Key_stmt->bind_param (`s`, $ id) - $ dette->Key_stmt->Udfør () - $ dette->Key_stmt->store_result () - hvis ($ dette->Key_stmt->num_rows == 1) {$ dette->Key_stmt->BIND_RESULT ($ KEY) - $ Dette->Key_stmt->Hent () - Return $ Key-} else {$ random_key = hash (`sha512`, uniqid (mt_rand (1, mt_getrandmax ()), true)) - returnere $ random_key-}}
  • Billede med titlen 2238751 14
    11. Opret krypter og dekrypteringsfunktioner.
    Disse funktioner krypterer dataene for sessionerne, de bruger en krypteringsnøgle fra databasen, som er anderledes for hver session. Vi bruger ikke direkte den nøgle i kryptering, men vi bruger det til at gøre nøglen HASH endnu mere tilfældigt.

    Krypter () og dekryptering () funktioner:
    Privat funktion Krypter ($ Data, $ Key) {$ salt = `ch!SWE!RETREGU7W6BEDRUP7USUDUH9THED2CEGE * 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) - $ Krypteret = Base64_Code (MCRYPT_ENCRYPT (MCCYPT_RIJNDAEL_256, $ KEY, $ DATA, MCRYPT_MODE_ECB, $ IV) ) -retur $ Krypteret-} Privat funktion dekryptere ($ Data, $ Key) {$ salt = `ch!SWE!RETREGU7W6BEDRUP7USUDUH9THED2CEGE * 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, $ KEYPT_MODE_ECB, $ IV DATA), MCRYPT_MODE_ECB, $ IV ) - $ decrypted = rtrim ($ decrypted, " 0") -return $ decrypted-}
  • Billede med titlen 2238751 15
    12. Ende klasse.
    Her afslutter vi bare klasserne krøllede parenteser:

    Slutklasse:
    }
  • Metode 3 af 3:
    Oprettelse af sider med sessioner
    1. Billede med titlen 2238751 16
    1. Brug af sessioner med Custom Session Manager.
    Nedenfor er hvordan du vil starte en ny session - du skal medtage dette på hver side, du vil have adgang til sessionerne, Brug det i stedet for Session_start ()-

    Start en session:
    kræver (`session.klasse.php `) - $ session = ny session () - // indstillet til true, hvis du bruger HTTPS $ session->start_session (`_ s`, falsk) - $ _ session [`noget`] = `en værdi.`-cho $ _session [` noget `]-

    Tips

    Del på sociale netværk :
    Lignende