Diese 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 eingehen. Das heißt, wenn es jemandem gelingt, sich in die Datenbank zu hacken, werden alle Sitzungsdaten mit 256-Bit-AES-Verschlüsselung verschlüsselt.
Schritte
Methode 1 von 3: MySQL-Datenbank konfigurieren
Schritt 1. Erstellen Sie eine MySQL-Datenbank
In diesem Handbuch erstellen wir eine Datenbank namens "secure_sessions".
Sehen Sie sich an, wie Sie eine Datenbank in phpMyAdmin erstellen.
Oder Sie können den folgenden SQL-Code verwenden, um einen für Sie zu erstellen.
Datenbankcode erstellen:
DATENBANK ERSTELLEN `secure_sessions`;
Hinweis: Bei einigen Hosting-Diensten können Sie keine Datenbank über phpMyAdmin erstellen. Erfahren Sie, wie Sie dies in cPanel tun.
Schritt 2. Erstellen Sie einen Benutzer mit nur SELECT-, INSERT- und DELETE-Berechtigungen
Dies bedeutet, dass der Hacker bei einer Sicherheitsverletzung in unserem Skript keine Tabellen aus unserer Datenbank löschen kann. Wenn Sie wirklich paranoid sind, erstellen Sie für jede Funktion einen anderen Benutzer.
-
Benutzer:
"sec_user"
-
Passwort:
"eKcGZr59zAa2BEWU"
Benutzercode erstellen:
BENUTZER ERSTELLEN 'sec_user'@'localhost' IDENTIFIZIERT VON 'eKcGZr59zAa2BEWU'; GRANT SELECT, INSERT, UPDATE, DELETE ON `secure_sessions`.* TO 'sec_user'@'localhost';
Hinweis: Es ist eine gute Idee, das Passwort im obigen Code zu ändern, wenn Sie auf Ihrem eigenen Server laufen. (Achten Sie darauf, auch Ihren PHP-Code zu ändern.) Denken Sie daran, dass es kein Passwort sein muss, an das Sie sich erinnern können, damit make so kompliziert wie möglich ist. Hier ist ein zufälliger Passwortgenerator.
Schritt 3. Erstellen Sie eine MySQL-Tabelle namens "sessions"
Der folgende Code erstellt eine Tabelle mit 4 Feldern (id, set_time, data, session_key).
Erstellen Sie die Tabelle "Sitzungen":
CREATE TABLE `sessions` (`id` char(128) NOT NULL, `set_time` char(10) NOT NULL, `data` text NOT NULL, `session_key` char(128) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=latein1;
Wir verwenden den CHAR-Datentyp für Felder, deren Länge wir kennen, da die Felder "id" und "session_key" immer 128 Zeichen lang sind. Die Verwendung von CHAR spart hier Rechenleistung.
Methode 2 von 3: Datei session.class.php erstellen
Schritt 1. Klasse erstellen
Um eine neue Klasse zu beginnen, müssen Sie den folgenden Code eingeben:
Neue Klasse:
Klassensitzung {
Schritt 2. Erstellen Sie die _construct-Funktion
Diese Funktion wird jedes Mal aufgerufen, wenn wir mit der Klasse 'session' eine neue Instanz eines Objekts erstellen. Sie können sich hier über die PHP-Funktion _construct informieren.
Diese Funktion setzt unseren benutzerdefinierten Sitzungshandler so, dass er zur Verwendung verfügbar ist, sobald die Klasse instanziiert (d. h. erstellt/erstellt/konstruiert) ist.
_construct-Funktion:
function _construct() { // Legen Sie unsere benutzerdefinierten Sitzungsfunktionen fest. session_set_save_handler(array($this, 'open'), array($this, 'close'), array($this, 'read'), array($this, 'write'), array($this, 'destroy'), array($this, 'gc')); // Diese Zeile verhindert unerwartete Effekte bei der Verwendung von Objekten als Save-Handler. register_shutdown_function('session_write_close'); }
Schritt 3. Erstellen Sie die 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 im Code an, um zu sehen, was jede Zeile bewirkt.
start_session-Funktion:
function start_session($session_name, $secure) { // Stellen Sie sicher, dass das Sitzungscookie nicht über Javascript zugänglich ist. $httponly = true; // Für die Sitzung zu verwendender Hash-Algorithmus. (Verwenden Sie hash_algos(), um eine Liste der verfügbaren Hashes zu erhalten.) $session_hash = 'sha512'; // Prüfen, ob Hash verfügbar ist if (in_array($session_hash, hash_algos())) { // Setze die has-Funktion. ini_set('session.hash_function', $session_hash); } // Wie viele Bits pro Zeichen 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('session.hash_bits_per_character', 5); // Erzwinge, dass die Sitzung nur Cookies verwendet, keine URL-Variablen. ini_set('session.use_only_cookies', 1); // Session-Cookie-Parameter abrufen $cookieParams = session_get_cookie_params(); // Setze die Parameter session_set_cookie_params($cookieParams["lifetime"], $cookieParams["path"], $cookieParams["domain"], $secure, $httponly); // Den Sitzungsnamen ändern session_name($session_name); // Jetzt starten wir die Sitzung session_start(); // Diese Zeile regeneriert die Sitzung und löscht die alte. // Es generiert auch einen neuen Verschlüsselungsschlüssel in der Datenbank. session_regenerate_id(true); }
Schritt 4. Erstellen Sie eine offene Funktion
Diese Funktion wird von den PHP-Sitzungen aufgerufen, wenn wir eine neue Sitzung starten, wir verwenden sie, um eine neue Datenbankverbindung zu starten.
offene Funktion:
Funktion open() { $host = 'localhost'; $user = 'sec_user'; $pass = 'eKcGZr59zAa2BEWU'; $name = 'secure_sessions'; $mysqli = new mysqli($host, $user, $pass, $name); $this->db = $mysqli; true zurückgeben; }
Schritt 5. Schließen-Funktion erstellen
Diese Funktion wird aufgerufen, wenn die Sitzungen geschlossen werden sollen.
Schließfunktion:
Funktion close() { $this->db->close(); true zurückgeben; }
Schritt 6. Lesefunktion erstellen
Diese Funktion wird von PHP aufgerufen, wenn wir versuchen, auf eine Sitzung zuzugreifen, beispielsweise wenn wir echo $_SESSION['something']; verwenden. Da diese Funktion auf einer einzigen Seite möglicherweise viele Aufrufe enthält, nutzen wir vorbereitete Anweisungen nicht nur aus Sicherheitsgründen, sondern auch aus Gründen der Leistung. Wir bereiten die Anweisung nur einmal vor, dann können wir sie viele Male ausführen.
Wir entschlüsseln auch die Sitzungsdaten, die in der Datenbank verschlüsselt sind. Wir verwenden in unseren Sitzungen eine 256-Bit-AES-Verschlüsselung.
Lesefunktion:
Funktion read($id) { if(!isset($this->read_stmt)) { $this->read_stmt = $this->db->prepare("SELECT data FROM session 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->decrypt($data, $key); Rückgabe von $daten; }
Schritt 7. Erstellen Sie eine Schreibfunktion
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 write($id, $data) { // Eindeutigen Schlüssel abrufen $key = $this->getkey($id); // Daten verschlüsseln $data = $this->encrypt($data, $key); $Zeit = Zeit(); if(!isset($this->w_stmt)) { $this->w_stmt = $this->db->prepare("REPLACE INTO session (id, set_time, data, session_key) WERTE (?, ?, ?, ?)"); } $this->w_stmt->bind_param('siss', $id, $time, $data, $key); $this->w_stmt->execute(); true zurückgeben; }
Schritt 8. Erstellen Sie die Funktion zum Zerstören
Diese Funktion löscht die Sitzung aus der Datenbank, sie wird von PHP verwendet, wenn wir Funktionen wie session_destroy(); aufrufen.
Funktion zerstören:
Funktion Destroy($id) { if(!isset($this->delete_stmt)) { $this->delete_stmt = $this->db->prepare("DELETE FROM session WHERE id = ?"); } $this->delete_stmt->bind_param('s', $id); $this->delete_stmt->execute(); true zurückgeben; }
Schritt 9. Erstellen Sie die Funktion GC (Garbage Collector)
Diese Funktion ist die Garbage Collector-Funktion, die aufgerufen wird, um alte Sitzungen zu löschen. Die Häufigkeit, mit der diese Funktion aufgerufen wird, wird durch zwei Konfigurationsdirektiven, session.gc_probability und session.gc_divisor, bestimmt.
gc()-Funktion:
function gc($max) { if(!isset($this->gc_stmt)) { $this->gc_stmt = $this->db->prepare("DELETE FROM session WHERE set_time < ?"); } $alt = Zeit() - $max; $this->gc_stmt->bind_param('s', $old); $this->gc_stmt->execute(); true zurückgeben; }
Schritt 10. Erstellen Sie die Funktion getKey
Diese Funktion wird verwendet, um den eindeutigen Schlüssel für die Verschlüsselung aus der Sitzungstabelle zu erhalten. Wenn keine Sitzung vorhanden ist, wird nur ein neuer zufälliger Schlüssel zur Verschlüsselung zurückgegeben.
getkey() Funktion:
private Funktion getkey($id) { if(!isset($this->key_stmt)) { $this->key_stmt = $this->db->prepare("SELECT session_key FROM session WHERE 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(); $schlüssel zurückgeben; } else { $random_key = hash('sha512', uniqid(mt_rand(1, mt_getrandmax()), true)); gibt $random_key zurück; } }
Schritt 11. Erstellen Sie Verschlüsselungs- und Entschlüsselungsfunktionen
Diese Funktionen verschlüsseln die Daten der Sitzungen, sie verwenden einen Verschlüsselungsschlüssel aus der Datenbank, der für jede Sitzung unterschiedlich ist. Wir verwenden diesen Schlüssel nicht direkt bei der Verschlüsselung, aber wir verwenden ihn, um den Schlüssel-Hash noch zufälliger zu machen.
Funktionen encrypt() und decrypt():
private Funktion encrypt($data, $key) { $salt = 'cH!swe!retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39=E@rAsp7c-Ph@pH'; $key = substr(hash('sha256', $salz.$key.$salz), 0, 32); $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_MODE_ECB, $iv)); geben $verschlüsselt zurück; } private Funktion decrypt($data, $key) { $salt = 'ch!swe!retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39=E@rAsp7c-Ph@pH'; $key = substr(hash('sha256', $salz.$key.$salz), 0, 32); $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); $entschlüsselt = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($data), MCRYPT_MODE_ECB, $iv); $entschlüsselt = rtrim($entschlüsselt, "\0"); geben $entschlüsselt zurück; }
Schritt 12. Klasse beenden
Hier beenden wir nur die geschweiften Klammern der Klasse:
Abschlussklasse:
}
Methode 3 von 3: Erstellen von Seiten mit Sitzungen
Schritt 1. Verwenden von Sitzungen mit dem benutzerdefinierten Sitzungsmanager
Unten sehen Sie, wie Sie eine neue Sitzung starten würden; Sie müssen dies auf jeder Seite angeben, auf der Sie auf die Sitzungen zugreifen möchten. verwenden Sie es anstelle von session_start();
Sitzung starten:
require('session.class.php'); $session = neue Session(); // Bei Verwendung von https auf true setzen $session->start_session('_s', false); $_SESSION['something'] = 'Ein Wert.'; echo $_SESSION['etwas'];