Så här skapar du ett säkert sessionsledningssystem i php och mysql

Den här guiden visar hur du kan lagra dina sessioner säkert i en MySQL-databas. Vi kommer också att kryptera alla sessionsdata som går in i databasen, vilket innebär att om någon lyckas hacka in i databasen är alla sessionsdata krypterad av 256-bitars AES-kryptering.

Steg

Metod 1 av 3:
Konfigurera MySQL-databasen
  1. Bild med titeln 2238751 1
1. Skapa en MySQL-databas.
I den här guiden skapar vi en databas som heter "Secure_sessions".
Se hur man ska Skapa-A-databas-in-phpmyAdmin.
Eller du kan använda SQL-koden nedan kommer att skapa en för dig.

Skapa databaskod:
Skapa database `Secure_sessions` -
Obs! Vissa webbhotell tillåter dig inte att skapa en databas via phpmyadmin, lära dig hur man gör det i cpanel.
  • Bild med titeln 2238751 2
    2. Skapa en användare med bara välj, sätt in och ta bort behörigheter.
    Det betyder att om det någonsin var ett brott mot säkerheten i vårt skript kunde hackaren inte släppa tabeller från vår databas.Om du är verkligen paranoid, skapa en annan användare för varje funktion.

  • Användare: "SEC_USER"
  • Lösenord: "ekcgzr59zaa2bewu"


  • Skapa användarkod:
    Skapa användare "SEC_USER" @ `localhost` identifierad av `ekcgzr59zaa2bewu`-Grant Select, Infoga, Uppdatera, Radera på `Secure_sessions`.* Till "SEC_USER" @ `localhost`-

    Obs! Det är en bra idé att ändra lösenordet i koden ovan när du kör på din egen server. (Se till att du ändrar din PHP-kod också.) Kom ihåg att det inte behöver vara ett lösenord som du kan komma ihåg så att det är så komplicerat som möjligt. Här är en slumpmässigt lösenord generator.
  • Bild med titeln 2238751 3
    3. Skapa en MySQL-tabell som heter "sessioner".
    Koden nedan skapar ett bord med 4 fält (ID, SET_TIME, DATA, SESSION_KEY).

    Skapa "sessioner" tabell:
    Skapa tabell `sessioner` (` ID` char (128) inte null, `set_time` char (10) inte null,` data` text inte null, `session_key` char (128) inte null, primär nyckel (` id`) ) Motor = Innodb standard charset = latin1-
    Vi använder charatatypen för fält som vi känner till längden på, som fälten "id" och "session_key" kommer alltid att vara 128 tecken långa. Använda char här sparar på bearbetningskraft.
  • Metod 2 av 3:
    Skapa session.klass.PHP-fil
    1. Bild med titeln 2238751 4
    1. Skapa klass.
    För att starta en ny klass måste du ange koden nedan:

    Ny klass:
    klass session {
  • Bild med titeln 2238751 5
    2. Skapa __Construct-funktionen.
    Denna funktion kommer att kallas varje gång vi skapar en ny instans av ett objekt med hjälp av "session" -klassen. Du kan läsa upp PHP __Construct-funktionen här.
    Den här funktionen ställer in vår anpassade sessionhanterare så att den är tillgänglig för användning så snart klassen är instantierad (i.e., Made / Byggd / konstruerad).

    __Construct Function:
    Funktion __Construct () {// Ställ in våra anpassade sessionsfunktioner.session_set_save_handler (array ($ this, "open"), array ($ this, "close"), array ($ det här, "läs"), array ($ detta, "skriv"), array ($ detta, "förstör" ), array ($ detta, "gc")) - // den här linjen förhindrar oväntade effekter när du använder objekt som spara hanterare.Register_shutDown_Function (`session_write_close`) -}
  • Bild med titeln 2238751 6
    3. Skapa Start_Session-funktionen.
    Den här funktionen kommer att kallas varje gång du vill starta en ny session, använd den istället för session_start ()-. Se kommentarerna i koden för att se vad varje rad gör.

    Start_session Funktion:
    Funktionstart_session ($ session_name, $ Secure) {// Kontrollera att session cookie inte är tillgänglig via jаvascript.$ httponly = true - // hash algoritm att använda för sessionen. (använd hash_algos () för att få en lista över tillgängliga hash.) $ session_hash = `sha512` - // check om hash är tillgänglig (in_array ($ session_hash, hash_algos ())) {// Ställ in funktionen.INI_SET (`session.hash_function `, $ session_hash) -} // hur många bitar per karaktär av hash.// De möjliga värdena är `4` (0-9, A-F), `5` (0-9, A-V) och `6` (0-9, A-Z, A-Z, "-", ",").INI_SET (`session.hash_bits_per_character `, 5) - // Tvinga sessionen att bara använda cookies, inte URL-variabler.INI_SET (`session.use_only_cookies `, 1) - // få session cookie parametrar $ cookieparams = session_get_cookie_params () - // Ställ in parameterssession_set_cookie_params ($ cookieparams ["livstid"], $ cookieparams ["väg"], $ cookieparams ["domän"], $ Säker, $ httponly) - // ändra sessionsnamn session_name ($ session_name) - // nu vi katt start sessionsession_start () - // den här linjen regenererar sessionen och radera den gamla. // Det genererar också en ny krypteringsnyckel i databasen. session_regenerate_id (True) -}
  • Bild med titeln 2238751 7
    4. Skapa öppen funktion.
    Denna funktion kommer att kallas av PHP-sessionerna när vi startar en ny session, använder vi den för att starta en ny databasanslutning.

    Öppna funktionen:
    Funktion öppen () {$ värd = `localhost` - $ Pass = `ekcgzr59zaa2bewu` - $ name = `Secure_sessions` - $ MySqli = New MySsSmi ($ värd, $ användare, $ pass, $ namn ) - $ det här->db = $ mysqli-reture true-}
  • Bild med titeln 2238751 8
    5. Skapa nära funktion.
    Denna funktion kommer att kallas när sessionerna vill stängas.

    Stäng funktion:
    Funktion nära () {$ det här->db->Stäng () - returnera True-}
  • Bild med titeln 2238751 9
    6. Skapa läsfunktion.
    Denna funktion kommer att kallas av PHP när vi försöker få tillgång till en session, till exempel när vi använder Echo $ _session [`något`]-. Eftersom det kan finnas många samtal till den här funktionen på en enda sida, utnyttjar vi beredda uttalanden, inte bara för säkerhet utan för prestanda också. Vi förbereder bara uttalandet en gång då kan vi utföra det många gånger.
    Vi dekrypterar även sessiondata som krypteras i databasen. Vi använder 256-bitars AES-kryptering i våra sessioner.

    Läs funktion:
    Funktionsläsning ($ ID) {IF (!Isset ($ det här->read_stmt)) {$ det här->read_stmt = $ det här->db->förbereda("Välj data från sessioner där id = ? Begränsa 1") -} $ det här->read_stmt->Bind_Param (`s`, $ ID) - $ det här->read_stmt->exekvera () - $ det här->read_stmt->Store_result () - $ Detta->read_stmt->Bind_result ($ data) - $ detta->read_stmt->hämta () - $ nyckel = $ det här->GetKey ($ ID) - $ Data = $ Detta->dekryptera ($ data, $ nyckel) -Return $ data-}
  • Bild med titeln 2238751 10
    7. Skapa skrivfunktion.
    Denna funktion används när vi tilldelar ett värde till en session, till exempel $ _session [`något`] = `något annat`-. Funktionen krypterar alla data som läggs in i databasen.

    Skriv funktion:
    Funktion Skriv ($ ID, $ data) {// få unik key $ key = $ det här->GetKey ($ ID) - // kryptera data $ data = $ det här->Kryptera ($ data, $-nyckel) - $ Time = Tid () - om (!Isset ($ det här->w_stmt)) {$ det här->w_stmt = $ det här->db->förbereda("Byt ut till sessioner (ID, SET_TIME, DATA, SESSION_KEY) -värden (?, ?, ?, ?)") -} $ det här->w_stmt->Bind_Param (`siss`, $ ID, $ Time, $ Data, $ Key) - $ Detta->w_stmt->exekvera () - returnera true-}
  • Bild med titeln 2238751 11
    8. Skapa förstör funktion.
    Den här funktionen raderar sessionen från databasen, den används av PHP när vi ringer funktioner som session__destroy ()-.

    Förstörande funktion:
    funktion förstör ($ ID) {om (!Isset ($ det här->DELETE_STMT)) {$ det här->DELETE_STMT = $ det här->db->förbereda("Ta bort från sessioner där id = ?") -} $ det här->DELETE_STMT->Bind_Param (`s`, $ ID) - $ det här->DELETE_STMT->exekvera () - returnera true-}
  • Bild med titeln 2238751 12
    9. Skapa GC (Garbage Collector) -funktion.
    Den här funktionen är Garbage Collector-funktionen den kallas för att radera gamla sessioner. Frekvensen i vilken den här funktionen kallas bestäms av två konfigurationsdirektiv, session.GC_Probability och session.gc_divisor.

    GC () Funktion:
    Funktion GC ($ MAX) {IF (!Isset ($ det här->gc_stmt)) {$ det här->gc_stmt = $ det här->db->förbereda("Ta bort från sessioner där set_time < ?") -} $ gammal = tid () - $ max-$ det här->gc_stmt->Bind_Param (`s`, $ gammal) - $ det här->gc_stmt->exekvera () - returnera true-}
  • Bild med titeln 2238751 13
    10. Skapa GetKey-funktionen.
    Denna funktion används för att få den unika nyckeln för kryptering från sessionstabellen. Om det inte finns någon session returnerar det bara en ny slumpmässig nyckel för kryptering.

    GetKey () Funktion:
    Privat funktion GetKey ($ ID) {IF (!Isset ($ det här->key_stmt)) {$ det här->key_stmt = $ det här->db->förbereda("Välj session_key från sessioner där id = ? Begränsa 1") -} $ det här->key_stmt->Bind_Param (`s`, $ ID) - $ det här->key_stmt->exekvera () - $ det här->key_stmt->Store_result () - Om ($ det här->key_stmt->num_rows == 1) {$ det här->key_stmt->BIND_RESULT ($ Key) - $ Detta->key_stmt->hämta () - return $ key-} annars {$ random_key = hash (`sha512`, uniqid (mt_rand (1, mt_getRandmax ()), sant)) - returnera $ random_key-}}
  • Bild med titeln 2238751 14
    11. Skapa kryptering och dekryptera funktioner.
    Dessa funktioner krypterar data för sessionerna, de använder en krypteringsnyckel från databasen som är annorlunda för varje session. Vi använder inte direkt den nyckeln i krypteringen, men vi använder den för att göra nyckeln hash ännu mer slumpmässig.

    Kryptera () och dekryptera () funktioner:
    privat funktion kryptera ($ data, $ nyckel) {$ salt = `ch!swe!Retregu7w6bedrup7usuduh9thed2chege * ewr4N39 = E @ Rasp7C-pH @ pH `- $ nyckel = substr (hash (` sha256 `, $ salt.$ nyckel.$ Salt), 0, 32) - $ iv_size = Mcrypt_Get_El_256, mcrypt_mode_ecb) - $ iv = mcrypt_create_iv ($ iv_size, mcrypt_rand) - $ krypterad = base64_codeel_256, $ nyckel, $ data, mcrypt_mode_ecb, $ iv) ) -Return $ krypterad-} Privat funktion dekryptera ($ data, $ nyckel) {$ salt = `ch!swe!Retregu7w6bedrup7usuduh9thed2chege * ewr4N39 = E @ Rasp7C-pH @ pH `- $ nyckel = substr (hash (` sha256 `, $ salt.$ nyckel.$ Salt), 0, 32) - $ iv_size = Mcrypt_RijNDael_256, mcrypt_mode_ecb) - $ iv = mcrypt_create_iv ($ iv_size, mcrypt_rand) - $ dekrypterad = mcrypt_decrypt (mcrypt_rijndael_256, $ nyckel, base64_decode ($ data), mcrypt_mode_ecb, $ iv ) - $ dekrypterad = rtrim ($ dekrypterad, " 0") -Return $ dekrypterad-}
  • Bild med titeln 2238751 15
    12. Slutklass.
    Här slutar vi bara klasserna Curly-fästen:

    Slutklass:
    }
  • Metod 3 av 3:
    Skapa sidor med sessioner
    1. Bild med titeln 2238751 16
    1. Använda sessioner med den anpassade sessionshanteraren.
    Nedan är hur du skulle starta en ny session - du skulle behöva inkludera detta på varje sida du vill komma åt sessionerna, använd det istället för session_start ()-

    Starta en session:
    kräva (session.klass.php `) - $ session = ny session () - // uppsättning till sant om du använder https $ session->start_session (`_ s`, false) - $ _ session [`något`] = `Ett värde.`-Echo $ _session [` något `]-

    Tips

    Dela på det sociala nätverket:
    Liknande