dmylogi.com

Hoe om `n veilige sessiebestuurstelsel in PHP en MySQL te skep

Hierdie gids sal jou wys hoe om sessies veilig te stoor in `n mySQL databasis. Jy sal ook leer om al die data van die sessie enkripteer om te gaan na die databasis, of as iemand dit regkry om te hack in die databasis, sal alle data sessies met AES 256-bit encryption wees.

stappe

Metode 1

Stel die mySQL databasis op
1
Skep `n MySQL databasis.
In hierdie gids sal ons `n databasis genaamd skep sesiones_seguras.
Kyk hoe `n databasis in phpMyAdmin geskep word.
Of jy kan die onderstaande SQL-kode gebruik om een ​​te skep.

Skep die databasiskode:
CREATE DATABASE `secure_sessions` -

Nota: sommige hosting services laat jou nie toe om `n databasis te maak met phpMyAdmin, leer om dit in cPanel te doen.
  • 2
    Skep `n gebruiker wat net voorregte het vir SELECT, INSERT en DELETE.
    As daar dus `n skending in die sekuriteit van ons script is, kan die hacker nie tabelle uit die databasis verwyder nie. As jy regtig paranoïes is, skep `n ander gebruiker vir elke funksie.

  • gebruiker: "Sec_user"
  • wagwoord: "EKcGZr59zAa2BEWU"


  • Skep die gebruikerskode:
    SKEP gebruiker sec_user `@` localhost `identified by` eKcGZr59zAa2BEWU`-GRANT te kies, INSERT, UPDATE, DELETE OP `sesiones_seguras`. * OM `sec_user` @ `localhost`-

    Nota: `n goeie idee is om die wagwoord van die bogenoemde kode te verander wanneer u dit op u eie bediener uitvoer (maak seker dat u ook die PHP-kode verander). Onthou dat jy nie die wagwoord moet onthou nie, so jy kan dit so hard doen as wat jy kan. Hier is `n kragopwekker ewekansige wagwoorde.
  • 3
    Skep `n MySQL-tabel genaamd "sessies".
    Die kode wat volg sal `n tabel skep met 4 velde (id, tyd, data, sessie_key).

    Skep die "sessies" tabel:
    CREATE TABLE `sesiones` (` id` CHAR (128) NIE NULL: horario` CHAR (10) NIE NULL, `data` teks NIE NULL: clave_sesion` CHAR (128) NIE NULL, primêre sleutel ( `id`) ) MOTOR = InnoDB DEFAULT CHARSET = latin1-

    Gebruik die CHAR data tipe vir velde met `n bekende lengte, soos die "id" en "session_key" velde, wat altyd 128 karakters lank sal wees. Deur CHAR te gebruik, sal ons verwerkende krag bespaar.
  • Metode 2

    Skep `n sesion.class.php lêer
    1
    Skep `n klas
    Om `n nuwe klas te initialiseer, moet u die volgende kode invoer:

    Nuwe klas:
    klas sessie {
  • 2
    Skep die funksie __construct.
    Hierdie funksie sal genoem word elke keer as jy `n nuwe voorwerp van `n voorwerp skep met die klas `sessie`. U kan lees oor die PHP _construct funksie hier.
    Dit stel ons persoonlike sessie hanteerder om so gou dit beskikbaar te stel as die klas is geïnisialiseer (dit wil sê, dit gedoen word, op te stel of te bou).

    __construct funksie:
    funksie __construct () {// stel die sessie funksies personalizada.session_set_save_handler (array ($ hierdie, "oop"), array ($ hierdie, `naby`), array ($ hierdie, `lees`), array ($ hierdie, `skryf`), array ($ hierdie, `vernietig`), array ($ hierdie, `gc`)) - // hierdie lyn verhoed onverwagte voorwerpe met as manipuleerders guardado.register_shutdown_function ( `session_write_close`) effekte - }
  • 3
    Skep `n session_session funksie.
    Hierdie funksie sal genoem word elke keer as iemand `n nuwe sessie wil begin, in plaas van session_start () te gebruik. Kyk na die kommentaar in die kode om te sien wat elke lyn doen.

    session_start funksie:
    inicio_sesion funksie ($ session_name, $ beveilig) {// Maak seker dat die sessie koekie kan nie verkry word deur jаvascript $ httponly = true -. // hash algoritme vir gebruik met sessie-. (Gebruik hash_algos () om `n lys van beskikbare hash sien) $ session_hash = `sha512` - // Gaan vir `n hash disponibleif (in_array ($ session_hash, hash_algos ())) {// Stel die hash.ini_set funksie ( `session.hash_function` $ session_hash) -} // baie stukkies per karakter hash.// moontlike waardes is `4` (0-9, af), `5` (0-9, v), en ` 6 `(0-9, az, AZ, ";", "") ini_set. (` session.hash_bits_per_character, 5) - // Force die sessie koekies om net, nie veranderlikes URL.ini_set gebruik ( ` session.use_only_cookies `, 1) - // Kry parameters sessie koekie $ cookieParams = session_get_cookie_params () - // Stel die parámetrossession_set_cookie_params ($ cookieParams [ "leeftyd"], $ cookieParams [ "pad"], $ cookieParams [ `n domein `], $ beveilig, $ httponly) - // herbenoem die sesiónsession_name ($ session_name) - // ons kan nou begin sesiónsession_start () - // Hierdie reël regenereer die sessie en skakel die anterior.// Dit genereer ook `n nuwe enkripsiesleutel in die basis van data. session_regenerate_id (true) -}
  • 4
    Skep `n oop funksie.
    Die PHP-sessies sal hierdie funksie noem wanneer u `n nuwe sessie begin. Ons gebruik dit om `n nuwe verbinding in die databasis te begin.

    oop funksie:
    funksie oop () {$ gasheer = `local host` - $ gebruiker = `sec_user` - $ pass = `eKcGZr59zAa2BEWU` - $ name = "sesiones_seguras `- $ mysqli = nuwe mysqli ($ gasheer, $ gebruiker, $ slaag, $ naam ) - $ this-> db = $ mysqli-return true-}
  • 5
    Skep `n noue funksie.
    Hierdie funksie sal genoem word wanneer die sessies gesluit wil word.

    sluit funksie:
    funksioneer naby () {$ this-> db-> naby () - terugkeer waar-}


  • 6
    Skep `n lees funksie.
    PHP sal hierdie funksie noem as jy probeer om toegang tot `n sessie te kry, byvoorbeeld wanneer jy echo $ _SESSION gebruik (`iets`] -. Aangesien daar baie oproepe na hierdie funksie op `n enkele bladsy kan wees, maak gebruik van voorbereide stellings, nie net vir sekuriteit nie, maar ook vir prestasie. Berei eers die stelling voor en voer dit dan baie keer uit.
    Dit dekodeer ook sessie data versleuteld in die databasis. U sal 256-bis AES-enkripsie in sessies gebruik.

    Lees funksie:
    funksie te lees ($ id) {if (isset ($ this-> read_stmt)) {$ this-> read_stmt = $ this-> db-> Voorberei ( "Kies data van sessies waar id = maksimum 1?") -} $ this-> read_stmt-> bind_param (se `, $ id) - $ this-> read_stmt-> uit te voer () - $ this-> read_stmt-> store_result () - $ this-> read_stmt-> bind_result ($ data ) - $ this-> read_stmt-> haal () - $ key = $ this-> getkey ($ id) - $ data = $ this-> decrypt ($ data, $ sleutel) -RETURN $ data-}
  • 7
    Skep `n skryffunksie.
    Hierdie funksie sal gebruik word wanneer `n waarde aan `n sessie toegeken word, byvoorbeeld $ _SESSION [`something`] = `something else`-. Die funksie versleutelt alle data wat in die databasis ingevoeg moet word.

    skryf funksie:
    funksie te skryf ($ id, $ data) {// Kry `n enkele sleutel $ key = $ this-> getKey ($ id) - Versleutelt data // $ data = $ this-> enkripteer ($ data, $ sleutel) - $ tyd = tyd () - as (! isset ($ this-> w_stmt)) {$ this-> w_stmt = $ this-> db-> berei ( "VERVANG MET sessies (id, tyd, data, clave_sesion) WAARDES ( ? ,,) ") -?} $ this-> w_stmt-> bind_param ( `SISS`, $ id, $ tyd, $ data, $ sleutel) - $ this-> w_stmt-> uit te voer () - opbrengs true-}
  • 8
    Skep `n vernietigende funksie.
    Hierdie funksie verwyder die sessie uit die databasis, dit gebruik PHP wanneer u funksies soos session__destroy () - noem.

    vernietig funksie:
    funksie te vernietig ($ id) {if (isset ($ this-> delete_stmt)) {$ this-> delete_stmt = $ this-> db-> Voorberei ( "verwyder uit sessies waar id =?") -} $ this- > delete_stmt-> bind_param (`s`, $ id) - $ this-> delete_stmt-> voer () - return true-}
  • 9
    Skep `n gc-funksie (vullisversamelaar, vir sy akroniem in Engels).
    Die vullisversamelaarfunksie word genoem om die ou sessies te verwyder. Die frekwensie waarmee hierdie funksie geroep word, sal bepaal word deur die twee konfigurasieriglyne, session.gc_probability en session.gc_divisor.

    gc funksie ():
    funksie gc ($ max) {if (! isset ($ this-> gc_stmt)) {$ this-> gc_stmt = $ this-> db-> voorberei ("DELETE FROM sessies WHERE skedule < ? ") -} $ ou = tyd () - $ max- $ this-> gc_stmt-> bind_param (se `, $ oud) - $ this-> gc_stmt-> uit te voer () - terugkeer true-}
  • 10
    Skep `n getkey-funksie.
    Hierdie funksie word gebruik om die unieke sleutel te kry om die sessie tabel te enkripteer. As daar nie `n sessie is nie, moet jy net `n nuwe ewekansige sleutel terugstuur om te enkripteer.

    getkey funksie ():
    private funksie getKey ($ id) {if (isset ($ this-> key_stmt)!) {$ this-> key_stmt = $ this-> db-> berei ( "Kies uit sessies waar clave_sesion id = maksimum 1?") - } $ this-> key_stmt-> bind_param (se `, $ id) - $ this-> key_stmt-> uit te voer () - $ this-> key_stmt-> store_result () - as ($ this-> key_stmt-> NUM_ROWS == 1) {$ this-> key_stmt-> bind_result ($ sleutel) - $ this-> key_stmt-> haal () - terugkeer $ sleutel-} anders {$ random_key = hash ( `sha512, uniqid (mt_rand (1 , mt_getrandmax ()), waar)) - terugkeer $ random_key-}}
  • 11
    Skep die enkripsie- en dekripsiefunksies.
    Hierdie funksies enkripteer die data van die sessies met `n enkripsiesleutel van die databasis wat vir elke sessie anders is. Die enkripsiesleutel word nie direk gebruik nie, maar jy sal dit gebruik om die sleutelhaak selfs meer ewekansig te skep.

    enkripteer () en dekripteer () funksies:
    private enkripteer funksie ($ data, $ sleutel) {$ sout = `CH swe retReGu7W6bEDRup7usuDUh9THeD2CHeGE * ewr4n39 = E @ rAsp7c-Ph @ pH! "- $ key = substr (hash (` sha256 `, $ sout $ sleutel $.. sout), 0, 32) - $ iv_size = mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB) - $ iv = mcrypt_create_iv ($ iv_size, MCRYPT_RAND) - $ geïnkripteer = base64_encode (mcrypt_encrypt (MCRYPT_RIJNDAEL_256, $ sleutel, $ data, MCRYPT_MODE_ECB, $ iv)) -RETURN $ encrypted-} private funksie dekripteer ($ data, $ sleutel) {$ sout = `CH swe ewr4n39 retReGu7W6bEDRup7usuDUh9THeD2CHeGE * = E @ rAsp7c-ph @ pH! "- $ key = substr (hash (` sha256 `, $ . sout $ sleutel $ sout), 0, 32) -. $ iv_size = mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB) - $ iv = mcrypt_create_iv ($ iv_size, MCRYPT_RAND) - $ Ontcijferde = MCRYPT_DECRYPT (MCRYPT_RIJNDAEL_256, $ sleutel, base64_decode ($ data) , MCRYPT_MODE_ECB, $ iv) -RETURN $ decrypted-}
  • 12
    Sluit die klasse.
    Hier sluit jy net die klasse met sleutels:

    Beslote klasse:
    }
  • Metode 3

    Skep bladsye met sessies
    1
    Gebruik sessies met die persoonlike sessiebestuurder.
    Hier is hoe om `n nuwe sessie te begin - jy moet dit op al die bladsye wat jy met die sessies wil gebruik, insluit, gebruik dit in plaas van session_start () -

    Begin `n sessie:
    vereis ( `sesion.class.php`) - $ sessie = nuwe sessie () - // dit in ware as jy gebruik https $ Sessie-> inicio_sesion ( `_ s`, vals) - $ _ SESSIE [ `iets`] = `n waarde .`- echo $ _SESSION [`something`] -
    Deel op sosiale netwerke:

    Verwante
    Hoe om `n databasis in MySQL te skepHoe om `n databasis in MySQL te skep
    Hoe om `n databasis in Excel te skepHoe om `n databasis in Excel te skep
    Hoe om `n databasis in SQL Server te skepHoe om `n databasis in SQL Server te skep
    Hoe om `n databasis te skep in phpMyAdminHoe om `n databasis te skep in phpMyAdmin
    Hoe om `n tafel in MySQL te skepHoe om `n tafel in MySQL te skep
    Hoe om `n E R diagram te teken met die MySQL databasis bestuurderHoe om `n E R diagram te teken met die MySQL databasis bestuurder
    Hoe om `n MySQL databasis te verwyderHoe om `n MySQL databasis te verwyder
    Hoe om Wordpress in XAMPP te installeerHoe om Wordpress in XAMPP te installeer
    Hoe om `n Wiki in minder as 20 minute te installeerHoe om `n Wiki in minder as 20 minute te installeer
    Hoe om `n MySQL-bediener op `n rekenaar te installeerHoe om `n MySQL-bediener op `n rekenaar te installeer
    » » Hoe om `n veilige sessiebestuurstelsel in PHP en MySQL te skep
    © 2022 dmylogi.com