3 Möglichkeiten zum Erstellen eines sicheren Sitzungsverwaltungssystems in PHP und MySQL

Inhaltsverzeichnis:

3 Möglichkeiten zum Erstellen eines sicheren Sitzungsverwaltungssystems in PHP und MySQL
3 Möglichkeiten zum Erstellen eines sicheren Sitzungsverwaltungssystems in PHP und MySQL

Video: 3 Möglichkeiten zum Erstellen eines sicheren Sitzungsverwaltungssystems in PHP und MySQL

Video: 3 Möglichkeiten zum Erstellen eines sicheren Sitzungsverwaltungssystems in PHP und MySQL
Video: 3 super Wege, Webdesign zu lernen (ohne Studium!) 2024, April
Anonim

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

2238751 1
2238751 1

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.

2238751 2
2238751 2

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.

2238751 3
2238751 3

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

2238751 4
2238751 4

Schritt 1. Klasse erstellen

Um eine neue Klasse zu beginnen, müssen Sie den folgenden Code eingeben:

Neue Klasse:

Klassensitzung {

2238751 5
2238751 5

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'); }

2238751 6
2238751 6

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); }

2238751 7
2238751 7

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; }

2238751 8
2238751 8

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; }

2238751 9
2238751 9

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; }

2238751 10
2238751 10

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; }

2238751 11
2238751 11

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; }

2238751 12
2238751 12

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; }

2238751 13
2238751 13

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; } }

2238751 14
2238751 14

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; }

2238751 15
2238751 15

Schritt 12. Klasse beenden

Hier beenden wir nur die geschweiften Klammern der Klasse:

Abschlussklasse:

}

Methode 3 von 3: Erstellen von Seiten mit Sitzungen

2238751 16
2238751 16

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'];

Empfohlen: