Hoe een beveiligd sessiebeheersysteem te maken in php en mysql

Deze gids laat u zien hoe u uw sessies veilig kunt opslaan in een MySQL-database. We zullen ook alle sessiegegevens versleutelen die in de database gaan, wat betekent dat als iemand erin slaagt aan de database te hacken, alle sessiegegevens worden gecodeerd door 256-bit AES-codering.

Stappen

Methode 1 van 3:
Configureer MySQL-database
  1. Titel afbeelding 2238751 1
1. Maak een MySQL-database.
In deze gids zullen we een database maken die wordt genoemd "Secure_sessions".
Zie hoe CREATE-A-database-in-phpmyadmin.
Of u kunt de onderstaande SQL-code gebruiken, zal er een voor u maken.

Maak een databasecode aan:
Maak een database `Secure_sessions` -
Opmerking: Sommige hosting-services staan ​​u niet toe dat u een database maakt via PHPMYADMIN, leer hoe u het in CPANEL kunt doen.
  • Titel afbeelding 2238751 2
    2. Maak een gebruiker met alleen selecteren, invoegen en verwijderen van privileges.
    Dit betekent dat als er ooit een overtreding van de beveiliging in ons script was, de hacker de tabellen niet uit onze database kon laten vallen.Als u echt paranoïde bent, maakt u een andere gebruiker voor elke functie.

  • Gebruiker: "sec_user"
  • Wachtwoord: "EKCGZR59ZAA2BEWU"


  • Maak gebruikerscode:
    Maak gebruiker `sec_user` @ `localhost` geïdentificeerd door `EKCGZR59ZAA2Bewu`-Grant Select, Insert, Update, Verwijder op `Secure_Sessions`.* Naar `sec_user` @ `localhost`-

    Opmerking: het is een goed idee om het wachtwoord in de hierboven hierboven te wijzigen bij het uitvoeren van op uw eigen server. (Zorg ervoor dat u ook uw PHP-code wijzigt.) Vergeet niet dat het geen wachtwoord hoeft te zijn dat u zich kunt herinneren, dus het maken is zo ingewikkeld mogelijk. Hier is een Willekeurig wachtwoord generator.
  • Titel afbeelding 2238751 3
    3. Maak een MySQL-tabel met de naam "sessies".
    De onderstaande code creëert een tabel met 4 velden (ID, set_time, gegevens, session_key).

    Maak de "sessies" tafel:
    Create tabel `sessies` (` id`-sessies (128) niet null, `set_time` char (10) niet null,` data`-tekst niet null, `session_key` char (128) niet null, primaire sleutel (` id `) ) Motor = Innodb standaard charset = Latin1-
    We gebruiken het CHAR-datatype voor velden waarvan we kennen de lengte van, als de velden "ID kaart" en "session_key" zal altijd 128 tekens lang zijn. Het gebruik van CHAR Hier slaat op bij verwerkingsvermogen.
  • Methode 2 van 3:
    Een sessie creëren.klasse.PHP-bestand
    1. Titel afbeelding 2238751 4
    1. Maak klasse.
    Om een ​​nieuwe klas te starten, moet u de onderstaande code invoeren:

    Nieuwe klas:
    klasse sessie {
  • Titel afbeelding 2238751 5
    2. Maak __-constructiefunctie.
    Deze functie wordt elke keer gebeld als we een nieuw exemplaar van een object maken met behulp van de klasse `Session`. U kunt lezen op de PHP __-instructiefunctie hier.
    Deze functie stelt onze aangepaste sessie-handler in, dus het is beschikbaar voor gebruik zodra de klasse is geïnstantieerd (I.e., gemaakt / gebouwd / geconstrueerd).

    __ZONTENDE FUNCTIE:
    Functie __Sonstruct () {// Stel onze aangepaste sessiefuncties in.session_set_save_handler (array ($ This, `open`), array ($ This, `close`), array ($ This, `lees`), array ($ dit, `schrijven`), array ($ dit, `vernietigen` ), array ($ this, `gc`)) - // Deze regel voorkomt onverwachte effecten bij het gebruik van objecten als handlers opslaan.REGISTREER_SHUTDOWN_FUNCTION (`SESSIE_WRITE_CLOSE`) -}
  • Titel afbeelding 2238751 6
    3. Maak start_sessiefunctie.
    Deze functie wordt geroepen elke keer dat u een nieuwe sessie wilt starten, gebruikt u deze in plaats van session_start ()-. Zie de opmerkingen in de code om te zien wat elke lijn doet.

    Start_Session Functie:
    Functie Start_Session ($ Session_Name, $ Secure) {// Controleer of de sessiecookie niet toegankelijk is via jаvascript.$ httponly = true - // hash algoritme om te gebruiken voor de sessie. (Gebruik Hash_Algos () om een ​​lijst met beschikbare hashes te krijgen.) $ session_hash = `SHA512` - // Controleer of HASH beschikbaar is (IN_ARRAY ($ session_hash, hash_algos ())) {// Set de functie heeft.ini_set (`sessie.hash_function `, $ session_hash) -} // Hoeveel bits per karakter van de hash.// De mogelijke waarden zijn `4` (0-9, A-F), `5` (0-9, A-V) en `6` (0-9, A-Z, A-Z, "-", ",").ini_set (`sessie.hash_bits_per_character `, 5) - // Forceer de sessie om alleen cookies te gebruiken, geen URL-variabelen.ini_set (`sessie.Gebruik_only_cookies `, 1) - // Get Session Cookie Parameters $ CookiParams = Session_Get_Cookie_Params () - // Stel de parameterssession_set_cookie_params in ($ CookiParams ["levenslang"], $ CookiParams ["pad"], $ CookiParams ["domein"], $ Secure, $ httponly) - // Wijzig de session name session_name ($ session_name) - // Nu starten we de sessionsession_start () - // Deze lijn regenereert de sessie en verwijder de oude. // Het genereert ook een nieuwe coderingssleutel in de database. session_regenerate_id (true) -}
  • Titel afbeelding 2238751 7
    4. Maak open functie.
    Deze functie zal worden opgeroepen door de PHP-sessies wanneer we een nieuwe sessie starten, gebruiken we het om een ​​nieuwe database-verbinding te starten.

    Open Functie:
    Functie Open () {$ Host = `Localhost` - $ User = `Sec_User` - $ Pass = `EKCGZR59ZAA2BEWU` - $ NAAM = `Secure_sessions` - $ MYSQLI = NIEUW MYSQLI ($ HOST, $ User, $ PASS, $ NAAM ) - $ dit->db = $ mysqli-return true-}
  • Titel afbeelding 2238751 8
    5. Creëer sluitende functie.
    Deze functie wordt gebeld wanneer de sessies gesloten willen zijn.

    Sluitende functie:
    functie sluiten () {$ dit->db->Sluiten () - Return True-}
  • Titel afbeelding 2238751 9
    6. Maak leesfunctie.
    Deze functie zal worden opgeroepen door PHP wanneer we proberen toegang te krijgen tot een sessie, bijvoorbeeld wanneer we echo $ _session [`iets` gebruiken]-. Omdat er veel oproepen naar deze functie op één pagina kunnen zijn, profiteren we van voorbereide uitspraken, niet alleen voor beveiliging, maar ook voor de uitvoering. We bereiden de verklaring alleen voor en dan kunnen we het vele malen uitvoeren.
    We decoderen ook de sessiegegevens die gecodeerd zijn in de database. We gebruiken 256-bits AES-codering in onze sessies.

    LEES-functie:
    Functie lezen ($ ID) {if (!Isset ($ dit->Read_stmt)) {$ dit->Read_stmt = $ dit->db->bereiden("Selecteer gegevens van sessies waar ID = ? Limiet 1") -} $ dit->Read_stmt->bind_param (`s`, $ id) - $ dit->Read_stmt->Execute () - $ dit->Read_stmt->Store_Result () - $ dit->Read_stmt->bind_result ($ gegevens) - $ dit->Read_stmt->FETCH () - $ KEY = $ dit->GETKEY ($ ID) - $ Data = $ dit->decoderen ($ gegevens, $ sleutel) -Return $ data-}
  • Titel afbeelding 2238751 10
    7. Maak schrijffunctie.
    Deze functie wordt gebruikt wanneer we een waarde aan een sessie toewijzen, bijvoorbeeld $ _session [`iets`] = `iets anders`-. De functie versleutelt alle gegevens die in de database worden ingevoegd.

    schrijffunctie:
    Functie Write ($ ID, $ Gegevens) {// Krijg unieke sleutel $ KEY = $ dit->GETKEY ($ ID) - // Versleutel de data $ -gegevens = $ dit->Versleutel ($ gegevens, $ sleutel) - $ time = tijd () - als (!Isset ($ dit->w_stmt)) {$ dit->w_stmt = $ dit->db->bereiden("Vervang in sessies (ID, set_time, gegevens, session_key) waarden (?, ?, ?, ?)") -} $ dit->w_stmt->bind_param (`siss`, $ id, $ time, $ gegevens, $ sleutel) - $ dit->w_stmt->Execute () - Retur True-}
  • Titel afbeelding 2238751 11
    8. Maak een vernietigingsfunctie.
    Deze functie verwijdert de sessie uit de database, het wordt gebruikt door PHP wanneer we functies zoals Session__Destroy ()-.

    Functie vernietigen:
    Functie vernietigen ($ id) {if (!Isset ($ dit->delete_stmt)) {$ dit->DELETE_STMT = $ DIT->db->bereiden("Verwijderen uit sessies waar id = ?") -} $ dit->delete_stmt->bind_param (`s`, $ id) - $ dit->delete_stmt->Execute () - Retur True-}
  • Titel afbeelding 2238751 12
    9. Maak GC (Garbage Collector) -functie.
    Deze functie is de functie Garbage Collector die het wordt genoemd om oude sessies te verwijderen. De frequentie waarin deze functie wordt genoemd, wordt bepaald door twee configuratierichtlijnen, sessie.gc_probility en sessie.gc_divisor.

    GC () functie:
    Functie GC ($ max) {if (!isset ($ dit->gc_stmt)) {$ dit->gc_stmt = $ dit->db->bereiden("Verwijderen uit sessies waar Set_time < ?") -} $ oud = tijd () - $ max- $ dit->gc_stmt->bind_param (`s`, $ oud) - $ dit->gc_stmt->Execute () - Retur True-}
  • Titel afbeelding 2238751 13
    10. Maak GetKey-functie.
    Deze functie wordt gebruikt om de unieke sleutel te krijgen voor codering van de sessietafel. Als er geen sessie is, retourneert het gewoon een nieuwe willekeurige sleutel voor codering.

    GETKEY () FUNCTION:
    Private Function GetKey ($ ID) {if (!Isset ($ dit->key_stmt)) {$ dit->key_stmt = $ dit->db->bereiden("Selecteer Session_Key uit sessies waar ID = ? Limiet 1") -} $ dit->key_stmt->bind_param (`s`, $ id) - $ dit->key_stmt->Execute () - $ dit->key_stmt->Store_Result () - if ($ dit->key_stmt->num_rows == 1) {$ dit->key_stmt->BIND_RESULT ($ KEY) - $ DIT->key_stmt->Fetch () - Retourneer $ Key-} anders {$ Random_Key = HASH (`SHA512`, UNIQID (MT_RAND (1, MT_GETRANDMAX ()), TRUE)) - RETURN $ RANDOME_KEY-}}
  • Titel afbeelding 2238751 14
    11. Maak codering en decoderen van functies.
    Deze functies versleutelen de gegevens van de sessies, ze gebruiken een versleutelingssleutel uit de database die voor elke sessie anders is. We gebruiken die sleutel niet direct in de codering, maar we gebruiken het om de sleutelhash nog meer willekeurig te maken.

    versleutelen () en decoderen () functies:
    Privé-functie Code ($ Gegevens, $ KEY) {$ Salt = `CH!swe!retregu7w6bedrup7USUDUH9THED2CHEGE * EWR4N39 = E @ RASP7C-PH @ PH `- $ KEY = substr (hash (SHA256`, $ zout.sleutel.$ zout), 0, 32) - $ IV_SIZE = Mcrypt_get_iv_size (Mcrypt_Rijndael_256, McRypt_Rijndael_ecb) - $ IV = mcrypt_create_iv ($ iv_size, mcrypt_rand) - $ gecodeerd = base64_encode (Mcrypt_Rijndael_256, $ Key, $ gegevens, mcrypt_mode_ecb, $ iv) ) -Return $ Encrypted-} Private Function Descrypt ($ Data, $ Key) {$ Salt = `CH!swe!retregu7w6bedrup7USUDUH9THED2CHEGE * EWR4N39 = E @ RASP7C-PH @ PH `- $ KEY = substr (hash (SHA256`, $ zout.sleutel.$ zout), 0, 32) - $ IV_SIZE = Mcrypt_Get_Iv_Size (Mcrypt_Rijndael_256, Mcrypt_MODE_ECB) - $ IV = mcrypt_create_iv ($ iv_size, mcrypt_rand) - $ gedecodeerde = mcrypt_decrypt (mcrypt_rijndael_256, $ sleutel, base64_decode ($ gegevens), mcrypt_mode_ecb, $ iv ) - $ gedecodeerd = rtrim ($ gedecodeerd, " 0") -Return $ decoctie-}
  • Titel afbeelding 2238751 15
    12. Eindklasse.
    Hier eindigen we de klassen krullende haakjes:

    Eindklasse:
    }
  • Methode 3 van 3:
    Pagina`s maken met sessies
    1. Titel afbeelding 2238751 16
    1. Sessies met de aangepaste sessiemanager gebruiken.
    Hieronder is hoe u een nieuwe sessie zou starten- u zou dit op elke pagina moeten opnemen die u toegang wilt geven tot de sessies, gebruik het in plaats van session_start ()-

    Een sessie starten:
    vereisen (`sessie.klasse.PHP `) - $ SESSIE = Nieuwe sessie () - // ingesteld op TRUE als u HTTPS $ SESSIE gebruikt->Start_Session (`_ s`, false) - $ _ sessie [`iets`] = `een waarde.`-Echo $ _session [` iets `]-

    Tips

    Deel in het sociale netwerk:
    Vergelijkbaar