2 Stimmen

Die Verwendung eines PHP-mehrdimensionalen Arrays als Datenbank

Ich baue ein privates CMS für meinen eigenen Gebrauch und bin an dem Punkt angelangt, an dem ich damit beginnen werde, die Funktionen zum Speichern von Benutzernamen und Passwörtern zu entwickeln. Ich erwäge die Möglichkeit, alle Admin-Benutzernamen, Passwörter und Benutzerdetails in einem mehrdimensionalen Array in einer PHP-Datei zu speichern, anstatt SQL zu verwenden, um sie in einer Datenbank zu speichern.

Der Grund, warum ich diesen nicht-traditionellen Ansatz zur Speicherung von Benutzerinformationen verwenden möchte, ist die Überzeugung, dass es so für Angreifer schwieriger sein wird, unberechtigten Zugriff auf Benutzerinformationen (Benutzernamen, Passwörter, IP-Adressen usw.) zu erlangen, da ich keine Verbindung zu einer MySQL-Datenbank herstelle.

Grober Code-Entwurf:

add_user.php

// Setzen der letzten Referrer-Sitzungsvariable auf die aktuelle Seite 
$_SESSION['last_referrer'] = 'add_user.php';

// Setzen der Roh-Credential-Variablen und des Salzes
$raw_user = $_POST['user'];
$raw_pass = $_POST['pass'];
$raw_IP = $_SERVER['REMOTE_ADDR'];
$salt = '&^${QqiO%Ur!W0,.#.*';

// Setzen des Benutzernamens, wenn er sauber ist, ansonsten false
$username = (is_clean($raw_user)) ? $raw_user : false; // is_clean() ist eine Funktion, die ich erstellen werde, um zu überprüfen, ob Zeichenfolgen sauber sind und an ein Array angehängt werden können, ohne einen Parsfehler zu erzeugen.

// Setzen des gesalzenen, bereinigten und verschlüsselten Passworts, wenn es sauber ist, ansonsten false
$password = (is_clean($raw_pass)) ? $salt . encrypt($raw_pass) : false; // encrypt() ist eine Funktion, die ich erstellen werde, um Passwörter auf eine bestimmte Weise zu verschlüsseln

// Wenn Benutzername und Passwort beide gültig und nicht false sind
if( $username && $password ) {

    // Setzen der IP-Adresse des Benutzers
    $IP = sanitize($raw_IP);

    // Erstellen eines temporären Schlüssels
    $temp_key = $_SESSION['temp_key'] = random_key(); 

    // random_key() ist eine Funktion, die ich erstellen werde, um einen Schlüssel zu erstellen, den ich nur so lange in einer Sitzung speichern werde, um Benutzerinformationen zur database.php-Datei hinzuzufügen

    // Benutzerdetails-Array zum Hauptarray aller Benutzer hinzufügen
    $add_user = append_array_to_file('database.php', array($username, $password, $IP)); 

    // append_array_to_file() ist eine Funktion, die ich erstellen werde, um Arrays dem bestehenden mehrdimensionalen Array hinzuzufügen, das alle Benutzeranmeldeinformationen enthält. 

    // Die Funktion wird die database.php-Datei mithilfe von cURL laden, damit database.php überprüfen kann, ob die temporäre Schlüssel-Sitzung gesetzt ist. Die Funktion append_array_to_file() wird anhalten und false zurückgeben, wenn die database.php-Datei zurückmeldet, dass der temporäre Schlüssel nicht gesetzt ist.

    // Die Funktion wird database.php durchsuchen und das aktuelle Array von Benutzern in die Funktion einlesen, dann die Anmeldeinformationen des aktuellen Benutzers dem Array hinzufügen und schließlich die database.php-Datei mit dem neuen Array überschreiben. 

    // Den temporären Sitzungsschlüssel zerstören
    unset($_SESSION['temp_key']);
}
else {
    return false;
}

database.php

$users_credentials = array(1 => array('username' => 'jack', 
                                      'password' => '&^${QqiO%Ur!W0,.#.*HuiUn34D09Qi!d}Yt$s',
                                      'ip'=> '127.0.0.1'), 
                           2 => array('username' => 'chris', 
                                      'password' => '&^${QqiO%Ur!W0,.#.*8YiPosl@87&^4#',
                                      'ip'=> '873.02.34.7')
                          );

Ich würde dann benutzerdefinierte Funktionen erstellen, um SQL-Abfragen wie SELECT für die Verwendung bei der Überprüfung von Benutzern, die sich anmelden wollen, zu simulieren.

Meine Fragen

  1. Ist dies eine schlechte Idee, und wenn ja, warum?

  2. Habe ich recht in der Annahme, dass dies die Anzahl der Möglichkeiten für Hacker, unbefugten Zugriff zu erlangen, das Ausspähen/Diebstahl von Passwörtern usw. reduzieren wird, da ich keine Verbindung zu einer entfernten Datenbank herstelle?

2voto

jeroen Punkte 89799

Ich sehe keinen Vorteil: Ob Sie eine Textdatei, eine MySQL-Datenbank oder eine PHP-Datei (=== Textdatei) verwenden, sie sind alle "Datenbanken" im Sinne von Dateien, in denen Sie Ihre Informationen speichern. Der Unterschied besteht darin, dass eine SQL-Datenbank dafür gemacht ist;

Ich sehe Nachteile, da es mehr potenzielle Schwachstellen gibt, über die Sie nachdenken müssten. Einige Beispiele (abgesehen von den Dingen, die in den Kommentaren erwähnt werden):

  • Sie müssen darauf achten, dass die Passwortdatei immer außerhalb des Web-Roots liegt, falls PHP abstürzt;
  • Sie müssen vermeiden, Ihre Passwortdatei z. B. im Quellcode-Repository herumzuschicken.

Diese Dinge sind nicht schwer zu lösen, aber wenn Sie eine normale Datenbank verwenden, müssen Sie sich darüber überhaupt keine Gedanken machen.

Abgesehen davon ist das Missverständnis des Zwecks des Salzes: Wenn Sie es einfach dem verschlüsselten Passwort voranstellen, macht es wirklich keinen Sinn, ein Salz zu verwenden. Sie müssen es Ihrem encrypt-Funktion übergeben, um es mit Ihrem Klartextpasswort zu hashen, damit Regenbogentabellen für jedes Passwort generiert werden müssten, anstatt nur eine für Ihre gesamte Datenbank. Aus diesem Grund sollten Sie auch nicht für alle Benutzer dasselbe Salz verwenden, jeder sollte ein anderes, einzigartiges Salz haben.

1voto

Ian Atkin Punkte 6116

Wenn Sie planen, irgendwelche Konfigurationsdaten in einer Textdatei jeglicher Art zu speichern, anstatt in einer traditionellen Datenbank, erwägen Sie die Verwendung einer .ini-Datei. Wenn ich mich nicht irre, können Sie sie auch außerhalb Ihres Web-Roots speichern, genauso wie die php.ini Datei.

Hier ist ein großartiger Beitrag, der genau erklärt, wie Sie das machen können: Verwendung von ini-Dateien für PHP-Anwendungseinstellungen

PHP Handbuch: get_cfg_var()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X