So erstellen sie ein sicheres sitzungsmanagementsystem in php und mysql

Dieser Anleitung zeigt Ihnen, wie Sie Ihre Sitzungen sicher in einer MySQL-Datenbank speichern können. Wir werden auch alle Sitzungsdaten verschlüsseln, die in die Datenbank gelangen, was bedeutet, was bedeutet, wenn jemand in die Datenbank gehalten wird, in der Datenbank alle Sitzungsdaten von 256-Bit-AES-Verschlüsselung verschlüsselt werden.

Schritte

Methode 1 von 3:
Konfigurieren Sie die MySQL-Datenbank
  1. Bildtitel 2238751 1
1. Erstellen Sie eine MySQL-Datenbank.
In diesem Handbuch erstellen wir eine Datenbank mit dem Namen "Secure_ssessions".
Sehen wie to Erstellen-A-Datenbank-in-phpMyadmin.
Oder Sie können den untenstehenden SQL-Code verwenden, der für Sie einen erstellt.

Datenbankcode erstellen:
Datenbank erstellen `Secure_ssessions` -
Hinweis: Einige Hosting-Services ermöglichen es Ihnen nicht, eine Datenbank über PHPMYADMIN zu erstellen, lernen Sie, wie es in CPANEL geht.
  • Bildtitel 2238751 2
    2. Erstellen Sie einen Benutzer, mit dem nur Berechtigungen ausgewählt, einfügen und löschen.
    Dies bedeutet, dass der Hacker, wenn der Hacker immer einen Sicherheitsverstoß in unserem Skript gab, den der Hacker nicht aus unserer Datenbank fallen lassen konnte.Wenn Sie wirklich paranoid sind, erstellen Sie einen anderen Benutzer für jede Funktion.

  • Benutzer: "sec_user"
  • Passwort: "EKCGZR59ZAA2BEWU"


  • Benutzercode erstellen:
    Erstellen Sie den Benutzer `SEC_USER` @ `localhost` von `ekcgzr59za2cewu`-grant Select, einfügen, aktualisieren, löschen auf `Secure_ssessions identifiziert`.* Zu `sec_user` @ `localhost`-

    Hinweis: Es ist eine gute Idee, das Kennwort in dem obigen Code zu ändern, wenn Sie auf Ihrem eigenen Server ausgeführt werden. (Stellen Sie sicher, dass Sie Ihren PHP-Code ändern.) Erinnern Sie sich daran, dass es kein Passwort sein muss, an das Sie sich erinnern können, so dass es so kompliziert wie möglich ist. Hier ist ein zufälliges Passwort Generator.
  • Bildtitel 2238751 3
    3. Erstellen Sie eine MySQL-Tabelle mit dem Namen "Sitzungen".
    Der untenstehende Code erstellt eine Tabelle mit 4 Feldern (ID, Set_Time, Daten, Session_Key).

    Erstellen Sie das "Sitzungen" Tabelle:
    Erstellen Sie Tabelle `Sessions` (` ID `char (128) nicht null,` set_time` char (10) nicht null, `Datenstext nicht null,` session_key` char (128) nicht null, primärer Schlüssel (`ID`) ) Motor = Innodb Standard Charset = Latin1-
    Wir verwenden den Chart-Datentyp für Felder, die wir kennen, die Länge von, wie die Felder "Ich würde" und "session_key" wird immer 128 Zeichen lang sein. Verwenden von CHAR Hier speichert die Verarbeitungsleistung.
  • Methode 2 von 3:
    Sitzung erstellen.Klasse.PHP-Datei
    1. Bildtitel 2238751 4
    1. Klasse erstellen.
    Um eine neue Klasse zu starten, müssen Sie den folgenden Code eingeben:

    Neue Klasse:
    Klasse Session {
  • Bildtitel 2238751 5
    2. Erstellen Sie __Construct-Funktion.
    Diese Funktion wird jedes Mal aufgerufen, wenn wir eine neue Instanz eines Objekts mithilfe der "Session-Klasse erstellen". Sie können auf der PHP __Construct-Funktion lesen Hier.
    Diese Funktion legt unseren benutzerdefinierten Sitzungshandler fest, sodass er zur Verfügung steht, sobald die Klasse instanziiert ist (ich.E., gemacht / gebaut / gebaut).

    __Construct-Funktion:
    Funktion __CONSTRUCT () {// Stellen Sie unsere benutzerdefinierten Sitzungsfunktionen ein.Session_Set_Save_Handler (ARRY ($ Dies, `Open`), Array ($ Dies, `Close`), Array ($ Dies, `Read`), Array ($ Dies, `Write`), Array ($ Dies, `Destroy` ), Array ($ Dies, `GC`) - // Diese Linie verhindert unerwartete Effekte, wenn Sie Objekte als Speichern von Handlern verwenden.register_shutdown_function (`session_write_close`) -}
  • Bildtitel 2238751 6
    3. Erstellen Sie Start_Session-Funktion.
    Diese Funktion wird jedes Mal aufgerufen, wenn Sie eine neue Sitzung starten möchten, verwenden Sie sie anstelle von session_start ()-. Sehen Sie sich die Kommentare in den Code an, um zu sehen, was jede Zeile tut.

    Start_Session-Funktion:
    Funktion start_session ($ session_name, $ sicher) {// Stellen Sie sicher, dass der Sitzungscookie über jаvascript nicht erreichbar ist.$ httponly = true - // Hash-Algorithmus für die Sitzung verwenden. (Verwenden Sie hash_algos (), um eine Liste der verfügbaren Hashes zu erhalten.) $ session_hash = `sha512` - // Überprüfen Sie, ob HASH verfügbar ist.INI_SET (`SITZUNG.Hash_Function `, $ session_hash) -} // Wie viele Bits pro Charakter des Hashs.// Die möglichen Werte sind `4` (0-9, A-F), `5` (0-9, A-V) und `6` (0-9, A-Z, A-Z, "-", ",").INI_SET (`SITZUNG.hash_bits_per_character `, 5) - // Die Sitzung zwingen, nur Cookies zu verwenden, keine URL-Variablen.INI_SET (`SITZUNG.use_only_cookies `, 1) - // Session Cookie-Parameter $ CookieParams = Session_Get_cookie_params () - // Legen Sie die ParameterSession_set_cookie_params ($ cookieparams ["Lebensdauer"] $ Cookieparams ["Pfad"] $ Cookieparams ["Domain"], $ Secure, $ httponly) - // Ändern Sie den Sitzungsnamen Session_Name ($ session_name) - // Jetzt katieren wir die SESSIONSESSION_START () - // Diese Linie regeneriert die Sitzung und löscht den alten. // er generiert auch einen neuen Verschlüsselungsschlüssel in der Datenbank. session_regenererate_id (true) -}
  • Bildtitel 2238751 7
    4. Erstellen Sie eine offene Funktion.
    Diese Funktion wird von den PHP-Sitzungen aufgerufen, wenn wir eine neue Sitzung starten, verwenden wir sie, um eine neue Datenbankverbindung zu starten.

    Offene Funktion:
    Funktion offen () {$ host = `localhost` - $ user = `sec_user` - $ pass = `ekcgzr59zaa2wewu` - $ name = `Secure_ssessions` - $ mySqli = New MySqli ($ host, $ user, $ Pass, $ Name) ) - $ das->db = $ mysqli-return true-}
  • Bildtitel 2238751 8
    5. Close-Funktion erstellen.
    Diese Funktion wird aufgerufen, wenn die Sitzungen geschlossen werden möchten.

    Schließen Sie die Funktion:
    Funktion close () {$ this->db->close () - Return true-}
  • Bildtitel 2238751 9
    6. Lesefunktion erstellen.
    Diese Funktion wird von PHP aufgerufen, wenn wir versuchen, auf eine Sitzung zuzugreifen, zum Beispiel, wenn wir Echo $ _Session verwenden ["Etwas"]-. Da es viele Anrufe auf dieser Funktion auf einer einzigen Seite geben, nutzen wir von vorbereiteten Aussagen, nicht nur für die Sicherheit, sondern auch für die Leistung. Wir bereiten die Aussage nur einmal vor, dann können wir es oft ausführen.
    Wir entschlüsseln auch die in der Datenbank verschlüsselten Sitzungsdaten. Wir verwenden 256-Bit-AES-Verschlüsselung in unseren Sitzungen.

    Lesefunktion:
    Funktion Lese ($ ID) {if (!Isset ($ Dies->read_stmt)) {$ das->read_stmt = $ das->db->bereiten("Wählen Sie Daten aus den Sitzungen aus, in denen id = ? Limit 1") -} $->read_stmt->binden_param (`s`, $ ID) - $ Dies->read_stmt->Execute () - $ Dies->read_stmt->store_result () - $ das->read_stmt->binden_result ($ data) - $ Dies->read_stmt->Fetch () - $ KEY = $ Dies->Getkey ($ ID) - $ data = $ Dies->Entschlüsseln ($ Daten, $ Key) -Return $ Daten
  • Bildtitel 2238751 10
    7. Schreibfunktion erstellen.
    Diese Funktion wird verwendet, wenn wir einer Sitzung einen Wert zuweisen, zum Beispiel $ _SESSION [`etwas`] = `etwas anderes`-. Die Funktion verschlüsselt alle Daten, die in die Datenbank eingefügt werden.

    Schreibfunktion:
    Funktion schreiben ($ ID, $ data) {// Holen Sie sich eindeutiger Schlüssel $ Key = $ Dies->Getkey ($ ID) - // verschlüsseln Sie die Daten $ Daten = $ Dies->verschlüsselt ($ data, $ key) - $ time = time () - wenn (!Isset ($ Dies->w_stmt)) {$ das->w_stmt = $ Dies->db->bereiten("Ersetzen Sie in Sessions (ID, Set_Time, Data, Session_Key) -Werte (?, ?, ?, ?)") -} $->w_stmt->binden_param (`siss`, $ ID, $ time, $ data, $ key) - $ Dies->w_stmt->Execute () - RETURN TRUE-}
  • Bildtitel 2238751 11
    8. Zerstörungsfunktion erstellen.
    Diese Funktion löscht die Sitzung aus der Datenbank, es wird von PHP verwendet, wenn wir Funktionen wie Session__Destroy () anrufen ()-.

    Funktion zerstören:
    Funktion zerstören ($ ID) {if (!Isset ($ Dies->delete_stmt)) {$ das->delete_stmt = $ Dies->db->bereiten("Löschen von Sitzungen, in denen id = ?") -} $->delete_stmt->binden_param (`s`, $ ID) - $ Dies->delete_stmt->Execute () - RETURN TRUE-}
  • Bildtitel 2238751 12
    9. GC-Funktion erstellen (Müllkollektor).
    Diese Funktion ist die Müllkollektorfunktion, die aufgerufen wird, um alte Sitzungen zu löschen. Die Häufigkeit, in der diese Funktion aufgerufen wird, wird von zwei Konfigurationsrichtlinien, Sitzungen bestimmt.GC_PROBILITÄT UND SITZUNG.GC_DIVISOR.

    GC () Funktion:
    Funktion GC ($ max) {if (!Isset ($ Dies->gc_stmt)) {$ das->gc_stmt = $ Dies->db->bereiten("Löschen Sie aus Sitzungen, in denen Set_time < ?") -} $ old = time () - $ max->gc_stmt->binden_param (`s`, $ alte) - $ Dies->gc_stmt->Execute () - RETURN TRUE-}
  • Bildtitel 2238751 13
    10. Getkey-Funktion erstellen.
    Diese Funktion wird verwendet, um den eindeutigen Schlüssel zur Verschlüsselung von der Sitzungstabelle zu erhalten. Wenn keine Sitzung vorhanden ist, gibt es einfach einen neuen Zufallsschlüssel zur Verschlüsselung zurück.

    Getkey () Funktion:
    Privatfunktion Getkey ($ ID) {if (!Isset ($ Dies->key_stmt)) {$ das->key_stmt = $ Dies->db->bereiten("Wählen Sie Session_Key aus den Sitzungen, in denen ID = ? Limit 1") -} $->key_stmt->binden_param (`s`, $ ID) - $ Dies->key_stmt->Execute () - $ Dies->key_stmt->store_result () - wenn ($ das->key_stmt->Num_Rows == 1) {$ das->key_stmt->binden_result ($ KEY) - $ Dies->key_stmt->Fetch () - Rückgabe $ Key-} else {$ random_key = Hash (`sha512`, uniqid (mt_rand (1, mt_getrandmax (mt_rand (1, mt_getrandmax (mt_rand (1, mt_getrandmax (mt_rand (1, mt_getrandmax (mt_rand (1, mt_getrandmax), true) - Return $ random_key-}}
  • Bildtitel 2238751 14
    11. Verschlüsseln und Entschlüsseln von Funktionen erstellen.
    Diese Funktionen verschlüsseln die Daten der Sitzungen, sie verwenden einen Verschlüsselungsschlüssel aus der Datenbank, die für jede Sitzung unterschiedlich ist. Wir verwenden diesen Schlüssel nicht direkt in der Verschlüsselung, aber wir verwenden ihn, um den Schlüssel Hash noch mehr zufällig zu machen.

    Encrypt () und Entschlüsselung () Funktionen:
    Privatfunktion verschlüsseln ($ data, $ key) {$ salz = `ch!Sweat!retregu7w6bedrup7usuduh9th2Chege * EWR4N39 = E @ Rasp7c-pH @ pH `- $ KEY = SUBSTR (Hash (SHA256`, $ SALT.$ Key.$ salz), 0, 32) - $ IV_SIZE = MCYPT_GET_IV_SIZE (MCYPT_MODE_ECB_256, MCYPT_MODE_ECB) - $ IV = MCYPT_CRYPTE_IV ($ IV_SIZE, MCYPT_RAND) - $ verschlüsselt = base64_encode (mcrypt_encrypt (McYPT_RIJNDAEL_256, $ KEY, $ Data, McYPT_MODE_ECB, $ IV) ) -Return $ verschlüsselt-} Privatfunktion Entschlüsseln ($ Daten, $ Key) {$ salz = `ch!Sweat!retregu7w6bedrup7usuduh9th2Chege * EWR4N39 = E @ Rasp7c-pH @ pH `- $ KEY = SUBSTR (Hash (SHA256`, $ SALT.$ Key.$ salz), 0, 32) - $ IV_SIZE = MCYPT_GET_IV_SIZE (MCYPT_MODE_ECB) - $ IV = MCYPT_CRYPTE_IV ($ IV_SIZE, MCYPT_RAND) - $ decryppted = McYPT_DECRYPT (MCYPT_RIJNDAEL_256, $ KEY, BASE64_DECODE ($ Daten), McYPT_MODE_ECB, $ IV $ ) - $ entschlüsselt = rtrim ($ entschlüsselt, " 0") -return $ entschlüsselt}
  • Bildtitel 2238751 15
    12. Endklasse.
    Hier beenden wir einfach die klassen gelockten Klammern:

    Endklasse:
    }
  • Methode 3 von 3:
    Seiten mit Sitzungen erstellen
    1. Bildtitel 2238751 16
    1. Verwenden von Sitzungen mit dem benutzerdefinierten Sitzungsmanager.
    Nachfolgend würden Sie eine neue Sitzung beginnen - Sie müssen dies auf jeder Seite aufnehmen, auf die Sie auf die Sitzungen zugreifen möchten, Verwenden Sie es anstelle von session_start ()-

    Starten einer Sitzung:
    erfordern (`Sitzung.Klasse.PHP `) - $ Session = New Session () - // Setzen Sie auf true, wenn Sie HTTPS $ Session verwenden->start_session (`_ s`, false) - $ _ Sitzung [`Etwas`] = `Ein Wert.`-Echo $ _Session [` Etwas `]-

    Tipps

    In Verbindung stehende Artikel