emkiset.ru

Hoe een veilig sessiebeheersysteem in PHP en MySQL te creëren

In deze handleiding wordt uitgelegd hoe u sessies veilig in een mySQL-database kunt opslaan. Je leert ook alle gegevens van de sessie die naar de database gaat versleutelen, dat wil zeggen dat als iemand erin slaagt om de database te hacken, alle gegevens van de sessies worden geleverd met een 256-bits AES-codering.

stappen

Methode 1

Configureer de mySQL-database
1
Maak een MySQL-database.
In deze gids zullen we een database maken met de naam sesiones_seguras.
Zie hoe een database wordt aangemaakt in phpMyAdmin.
Of u kunt de onderstaande SQL-code gebruiken om er een te maken.

Maak de databasecode:
CREËER DATABASE `secure_sessions` -

Opmerking: sommige hostingservices staan ​​u niet toe om een ​​database te maken met phpMyAdmin, leer het te doen in cPanel.
  • 2
    Maak een gebruiker aan die alleen rechten heeft voor SELECT, INSERT en DELETE.
    Dus als er een inbreuk is op de beveiliging van ons script, kan de hacker geen tabellen uit de database verwijderen. Als je echt paranoïde bent, maak dan voor elke functie een andere gebruiker.

  • gebruiker: "Sec_user"
  • wachtwoord: "EKcGZr59zAa2BEWU"


  • Maak de gebruikerscode aan:
    CREATE USER `sec_user` @ `localhost` identified by `eKcGZr59zAa2BEWU`-GRANT SELECT, INSERT, UPDATE, DELETE ON `sesiones_seguras`. * TO` sec_user `@` localhost`-

    Opmerking: het is een goed idee om het wachtwoord van de bovenstaande code te wijzigen wanneer u het op uw eigen server uitvoert (zorg ervoor dat u ook de PHP-code wijzigt). Vergeet niet dat u het wachtwoord niet hoeft te onthouden, dus u kunt het zo hard mogelijk doen. Hier is een generator willekeurige wachtwoorden.
  • 3
    Maak een MySQL-tabel met de naam "sessies".
    De volgende code maakt een tabel met 4 velden (id, tijd, data, session_key).

    Maak de tabel "sessies":
    CREËER TAFEL `sessies` (` id` CHAR (128) NOT NULL, `schedule` CHAR (10) NOT NULL,` data` text NOT NULL, `session_key` CHAR (128) NOT NULL, PRIMARY KEY (` id`) ) MOTOR = InnoDB DEFAULT CHARSET = latin1-

    Gebruik het gegevenstype CHAR voor velden met een bekende lengte, zoals de velden "id" en "session_key", die altijd 128 tekens lang zijn. Door CHAR te gebruiken, besparen we verwerkingskracht.
  • Methode 2

    Maak een sesion.class.php bestand aan
    1
    Maak een klas
    Om een ​​nieuwe klasse te initialiseren, moet u de volgende code invoeren:

    Nieuwe les:
    class session {
  • 2
    Maak de functie __construct.
    Deze functie wordt elke keer dat u een nieuw exemplaar van een object maakt met de klasse `sessie` gemaakt. U kunt lezen over de functie PHP _construct hier.
    Deze functie configureert onze aangepaste sessiemanager zodat deze beschikbaar is zodra de klasse geïnitialiseerd is (dat wil zeggen, het is gedaan, gecompileerd of geconstrueerd).

    __construct functie:
    functie __construct () {// stel de sessie functies personalizada.session_set_save_handler (array ($ this, `open`), array ($ this, `dicht`), array ($ this, `lezen`), array ($ dit, `schrijven`), array ($ this, `vernietigen`), array ($ this, `gc`)) - // deze regel voorkomt onverwachte objecten met behulp van als manipulators guardado.register_shutdown_function ( `session_write_close`) effecten - }
  • 3


    Maak een session_session-functie.
    Deze functie wordt aangeroepen elke keer dat iemand een nieuwe sessie wil starten, in plaats van session_start () -. Kijk naar de opmerkingen in de code om te zien wat elke regel doet.

    session_start functie:
    inicio_sesion functie ($ session_name, $ bewaking) {// Zorg ervoor dat de sessie cookie kan niet worden geopend door jаvascript $ httponly = true -. // hash-algoritme voor gebruik met sessionid. (Gebruikt hash_algos () om een ​​lijst met beschikbare hash te zien) $ session_hash = `sha512` - // Controleer of er een hash disponibleif (in_array ($ session_hash, hash_algos ())) {// Stel de hash.ini_set functie ( `session.hash_function` $ session_hash) -} // aantal bits per teken hash.// mogelijke waarden zijn `4` (0-9, af), `5` (0-9, v) en " 6 `(0-9, az, AZ, ";", "") ini_set. (` session.hash_bits_per_character `5) - // Dwing de session cookies alleen, geen variabelen URL.ini_set gebruiken (` session.use_only_cookies`, 1) - // Get parameters session cookie $ cookieParams = session_get_cookie_params () - // Stel de parámetrossession_set_cookie_params ($ cookieParams [ "lifetime"], $ cookieParams [ "path"], $ cookieParams [ `domein`], $ veilig, $ httponly) - // Hernoemt de sesiónsession_name ($ session_name) - // kunnen we nu beginnen met sesiónsession_start () - // Deze lijn regenereert de sessie en elimineert de anterior.// Het genereert ook een nieuwe coderingssleutel in de basis van gegevens. session_regenerate_id (true) -}
  • 4
    Maak een open functie.
    De PHP-sessies roepen deze functie op wanneer u een nieuwe sessie start, we gebruiken deze om een ​​nieuwe verbinding in de database te starten.

    open functie:
    functie open () {$ host = `localhost` - $ user = `sec_user` - $ pas = `eKcGZr59zAa2BEWU` - $ name = `sesiones_seguras` - $ mysqli = new mysqli ($ host, $ user, $ pas, $ name ) - $ this-> db = $ mysqli-return true-}
  • 5
    Maak een close-functie.
    Deze functie wordt aangeroepen wanneer de sessies gesloten willen worden.

    sluit functie:
    function close () {$ this-> db-> close () - return true-}



  • 6
    Maak een leesfunctie.
    PHP roept deze functie op wanneer u een sessie probeert te openen, bijvoorbeeld wanneer u echo $ _SESSION [`something`] - gebruikt. Omdat er op één pagina veel oproepen naar deze functie kunnen worden uitgevoerd, kunt u profiteren van voorbereide instructies, niet alleen voor beveiliging, maar ook voor prestaties. Bereid de instructie eenmaal voor en voer deze vervolgens vele malen uit.
    Het decodeert ook sessiegegevens die zijn gecodeerd in de database. U gebruikt 256-bits AES-codering in sessies.

    Lees functie:
    functie lezen ($ id) {if (isset ($ this-> read_stmt)) {$ this-> read_stmt = $ this-> db-> prepare ( "SELECT gegevens van sessies 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-> decoderen ($ data, $ key) -Return $ data-}
  • 7
    Maak een schrijffunctie.
    Deze functie wordt gebruikt bij het toewijzen van een waarde aan een sessie, bijvoorbeeld $ _SESSION [`something`] = `iets anders`-. De functie codeert alle gegevens die in de database moeten worden ingevoegd.

    schrijf functie:
    functie write ($ id, $ data) {// Hier krijg je een enkele toets $ key = $ this-> getKey ($ id) - codeert gegevens // $ data = $ this-> versleutelen ($ data, $ key) - $ time = time () - if (! isset ($ this-> w_stmt)) {$ this-> w_stmt = $ this-> db-> bereiden ( "REPLACE INTO sessies (id, tijd, data, clave_sesion) WAARDEN ( ? ,,) ") -?} $ this-> w_stmt-> bind_param ( `SISS`, $ id, $ tijd, $ data, $ key) - $ this-> w_stmt-> execute () - terug true-}
  • 8
    Maak een vernietigingsfunctie.
    Deze functie verwijdert de sessie uit de database, het gebruikt PHP wanneer u functies zoals session__destroy () - aanroept.

    functie vernietigen:
    function destroy ($ id) {if (! isset ($ this-> delete_stmt)) {$ this-> delete_stmt = $ this-> db-> prepare ("DELETE FROM sessions WHERE id =?") -} $ this- > delete_stmt-> bind_param (`s`, $ id) - $ this-> delete_stmt-> execute () - return true-}
  • 9
    Maak een gc-functie aan (garbage collector, voor het acroniem in het Engels).
    De garbage collector-functie wordt aangeroepen om de oude sessies te verwijderen. De frequentie waarmee deze functie wordt aangeroepen, wordt bepaald door de twee configuratie-instructies session.gc_probability en session.gc_divisor.

    gc-functie ():
    functie gc ($ max) {if (! isset ($ this-> gc_stmt)) {$ this-> gc_stmt = $ this-> db-> prepare ("DELETE FROM sessions WHERE schedule < ? ") -} $ old = time () - $ max- $ this-> gc_stmt-> bind_param (`s`, $ old) - $ this-> gc_stmt-> execute () - return true-}
  • 10
    Maak een getkey-functie.
    Deze functie wordt gebruikt om de unieke sleutel te verkrijgen om de sessietabel te versleutelen. Als er geen sessie is, hoeft u alleen een nieuwe willekeurige sleutel in te voeren om te coderen.

    getkey-functie ():
    prive-functie getKey ($ id) {if (isset ($ this-> key_stmt)!) {$ this-> key_stmt = $ this-> db-> bereiden ( "SELECT FROM sessies waarin clave_sesion 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 () - terug $ sleutel-} else {$ random_key = hash ( `sha512`, uniqid (mt_rand (1 , mt_getrandmax ()), true)) - return $ random_key-}}
  • 11
    Maak de coderings- en decoderingsfuncties.
    Deze functies versleutelen de gegevens van de sessies met een coderingssleutel van de database die voor elke sessie anders is. De coderingssleutel wordt niet direct gebruikt, maar u gebruikt deze om de sleutelhas nog meer willekeurig te maken.

    codeer () en decodeer () functies:
    private encrypt functie ($ data, $ key) {$ salt = `CH swe retReGu7W6bEDRup7usuDUh9THeD2CHeGE * ewr4n39 = E @ rAsp7c-Ph @ pH!` - $ key = substr (hash ( `sha256`, $ zout $ key $.. zout), 0, 32) - $ iv_size = mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB) - $ iv = mcrypt_create_iv ($ iv_size, MCRYPT_RAND) - $ gecodeerde = base64_encode (mcrypt_encrypt (MCRYPT_RIJNDAEL_256, $ key, $ data, MCRYPT_MODE_ECB, $ iv)) -Return $ encrypted-} private function decrypteert ($ data, $ key) {$ salt = `cH swe ewr4n39 retReGu7W6bEDRup7usuDUh9THeD2CHeGE * = 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) - $ ontsleutelde = MCRYPT_DECRYPT (MCRYPT_RIJNDAEL_256, $ key, base64_decode ($ data) , MCRYPT_MODE_ECB, $ iv) -Return $ decrypted-}
  • 12
    Sluit de klassen.
    Hier sluit je gewoon de klassen met de toetsen:

    Sluiten klassen:
    }
  • Methode 3

    Maak pagina`s met sessies
    1
    Gebruik sessies met de aangepaste sessiemanager.
    Hier leest u hoe u een nieuwe sessie start - u moet dit opnemen op alle pagina`s die u wilt openen met de sessies, gebruik het in plaats van session_start () -

    Start een sessie:
    require (`session.class.php`) - $ session = new session () - // Stel dit in op true als u https $ session-> session_home (`_ s`, false) gebruikt - $ _ SESSION [`something`] = `A waarde .`- echo $ _SESSION [`iets`] -
    Delen op sociale netwerken:

    Verwant
    Hoe een database in MySQL te makenHoe een database in MySQL te maken
    Hoe een database in Excel te makenHoe een database in Excel te maken
    Hoe een database in SQL Server te makenHoe een database in SQL Server te maken
    Hoe een database te maken in phpMyAdminHoe een database te maken in phpMyAdmin
    Hoe een tabel in MySQL te makenHoe een tabel in MySQL te maken
    Hoe een E R-diagram te tekenen met de MySQL-databasemanagerHoe een E R-diagram te tekenen met de MySQL-databasemanager
    Hoe een MySQL-database te verwijderenHoe een MySQL-database te verwijderen
    Hoe Wordpress in XAMPP te installerenHoe Wordpress in XAMPP te installeren
    Hoe een Wiki te installeren in minder dan 20 minutenHoe een Wiki te installeren in minder dan 20 minuten
    Hoe een MySQL-server op een pc te installerenHoe een MySQL-server op een pc te installeren
    » » Hoe een veilig sessiebeheersysteem in PHP en MySQL te creëren
    © 2021 emkiset.ru