Bitte beachten Sie, dass dieses Projekt nicht mehr aktiv gepflegt wird.
Dieses Projekt begann als einfache Schulaufgabe für einen PHP-Kurs, den ich besuchte. Dann brauchte ich ein solches System für eine Website, die ich gerade erstellte, und beschloss, mit der Erweiterung zu beginnen. Ein Wort der Warnung: Dieses Projekt ist/wird sehr eigensinnig sein, was bedeutet, dass ich nur Funktionen hinzufügen werde, die ich selbst nützlich oder interessant genug finde, um sie zu entwickeln.
password_hash()
, um die Passwörter zu hashen und zu salzen. Benutzernamen werden als Klartext gespeichert.PASSWORD_DEFAULT
, das zum Zeitpunkt des Schreibens BCRYPT verwendet.Auch bekannt als „Warum gibt es so viele Dateien?“
Das Admin-Panel wird hier sein. Ähnlich wie bei vielen anderen Webanwendungen (wie WordPress) kann das Admin-Panel einfach durch Eingabe von [host]/admin aufgerufen werden.
Dieser Ordner enthält zwei Dateien, die zum Festlegen einiger Konfigurationsoptionen verwendet werden. Weitere Informationen weiter unten.
Nur ein paar CSS-Extras für die Benutzeroberfläche.
Das automatische Installationsprogramm befindet sich hier.
Dieser Ordner enthält alle .js-Dateien, die für die Funktion der Benutzeroberfläche erforderlich sind.
Dieser Ordner enthält das Rückgrat des Systems. Es verfügt über .php-Dateien zum Herstellen einer Verbindung zur Datenbank, zum An- und Abmelden, zum Registrieren/Erstellen eines neuen Kontos und zum Ändern vorhandener Konten. Es gibt auch scripts.js, das einige allgemeine JavaScript-Funktionen für die Benutzeroberfläche enthält. Sie müssen Ihre Datenbankinformationen in credentials.php eingeben. Weitere Informationen finden Sie im Setup-Abschnitt unten.
Sie sollten dies lesen, bevor Sie es verwenden. Es ist jedoch nur eine normale MIT-Lizenz.
Diese Datei.
Dies ist die Kontoverwaltungsseite. Benutzer können hier ihren Benutzernamen und ihr Passwort ändern.
Diese Datei dient nur der Demo. Auf diese Seite können die Benutzer nur zugreifen, wenn sie eingeloggt sind. Andernfalls werden sie auf die Anmeldeseite weitergeleitet.
Meine Meinung zum Erstellen eines einfachen Anmeldeformulars mit Bootstrap. Fühlen Sie sich frei, es an Ihre Bedürfnisse anzupassen.
Meine Meinung zum Erstellen eines einfachen Registrierungsformulars mit Bootstrap. Fühlen Sie sich frei, es an Ihre Bedürfnisse anzupassen.
Dies wird vom automatischen Installationsprogramm verwendet, um sich nach Abschluss der Installation selbst zu entfernen.
Dies ist die Liste der häufigsten englischen Wörter. Es wird vom Benutzernamensvorschlagsgeber verwendet. Sie können die Liste durch Ihre eigene TXT-Datei ersetzen. Auf jedes Wort in der Liste muss ein Zeilenumbruch folgen.
Bitte beachten Sie, dass sich die Konfigurationsoptionen ändern können. Schauen Sie öfters vorbei.
Wenn Sie den Ordner /config überprüfen, werden Sie feststellen, dass dort zwei verschiedene Dateien vorhanden sind. Was gibt es? Die Hauptkonfigurationsdatei ist config.php . Es umfasst Einstellungen, die auf Serverebene erzwungen werden. Sie sollten hauptsächlich diese Datei bearbeiten.
Wenn Sie auch die von mir bereitgestellte Frontend-Benutzeroberfläche verwenden, können/müssen Sie auch config.js bearbeiten. Dort können Sie verwalten, wie die Dinge für den durchschnittlichen Benutzer aussehen. Bitte beachten Sie, dass diese Einstellungen nur clientseitig sind und in keiner Weise erzwungen werden, sodass sie von Benutzern bearbeitet werden können.
Optionsname | Beschreibung | Standardwert | Unterstützte Werte |
---|---|---|---|
$disableUserSelfRegistration | Verhindern Sie, dass sich Benutzer registrieren | FALSCH | Boolescher Wert |
$usernameMinLength | Kürzester zulässiger Benutzername | 3 | 1 -> |
$usernameMaxLength | Längster zulässiger Benutzername | 30 | 1 -> |
$passwordMinLength | Mindestlänge von Passwörtern | 8 | 1 -> |
$usernameRegExp | Alle Benutzernamen müssen mit diesem regulären Ausdruck übereinstimmen | irgendein regExp | |
$passwordRegExp | Alle Passwörter müssen diesem regulären Ausdruck entsprechen | irgendein regExp | |
$newAccountAccessLevel | Nützlich für die Erstellung Ihres ersten Administratorkontos | "Benutzer" | „Benutzer“, „Administrator“ |
$debugMode | Ermöglicht das Deaktivieren der Datenbankverbindung (nur zum Debuggen). | "NEIN" | "NEIN" |
$debugAdminBenutzername | Ermöglicht die Anmeldung im Debug-Modus | „admin“ | irgendeine Zeichenfolge |
$debugAdminPassword | Ermöglicht die Anmeldung im Debug-Modus | „“ | irgendeine Zeichenfolge |
$debugSkipInstall | Dies dient nur Debugzwecken | FALSCH | FALSCH |
$timeout | Zeit der Inaktivität (in Sekunden), die zum Abmelden des Benutzers erforderlich ist | 900 | jede ganze Zahl |
$adminPanelTimeout | Zeit der Inaktivität, die erforderlich ist, um den Benutzer vom Admin-Panel abzumelden | 450 | jede ganze Zahl |
$errorMessages | Ausführlichere Fehlermeldungen anzeigen. Es könnten vertrauliche Informationen verloren gehen! | Standard | „default“, „verbose“ |
$allowUsernameChange | Sollten Benutzer in der Lage sein, ihren Benutzernamen zu ändern? | WAHR | Boolescher Wert |
$forceHTTPS | Leitet alle Nicht-HTTPS-Verbindungen zu HTTPS um und sendet HSTS | FALSCH | Boolescher Wert |
Im Jahr 2019 wird es als großes Sicherheitsrisiko angesehen, beim Umgang mit sensiblen Informationen jeglicher Art (wie Passwörtern) kein HTTPS zu verwenden. Aus diesem Grund wird dringend empfohlen, nur Hosting-Lösungen zu verwenden, die dies unterstützen, und diese Option auf „true“ zu ändern. Heutzutage kann man das SSL-Zertifikat sogar komplett kostenlos bei Let’s Encrypt erhalten, es gibt also keinen Grund, es nicht zu nutzen. Allerdings ist in einigen (schlecht konfigurierten) Umgebungen SERVER["HTTPS"] superglobal nicht definiert, selbst wenn HTTPS tatsächlich verwendet wird. Das führt zu einer Endlosschleife der Weiterleitung. Ich selbst habe das auf die harte Tour gelernt.
Optionsname | Beschreibung | Standardwert | Unterstützte Werte |
---|---|---|---|
disableUserSelfRegistration | Deaktiviert alle UI-Elemente im Zusammenhang mit der Registrierung | FALSCH | wahr, falsch |
BenutzernameMinLength | Kürzester Benutzername, den die Benutzeroberfläche akzeptiert | 3 | 1 -> |
BenutzernameMaxLength | Längster Benutzername, den die Benutzeroberfläche akzeptiert | 30 | 1 -> |
passwortMinLength | Kürzestes Passwort, das die Benutzeroberfläche akzeptiert | 8 | 1 -> |
BenutzernameRegeln | Diese Zeichenfolge wird angezeigt, wenn der Benutzername nicht mit dem regulären Ausdruck übereinstimmt | irgendeine Zeichenfolge | |
Passwortregeln | Diese Zeichenfolge wird angezeigt, wenn das Passwort nicht mit dem regExp übereinstimmt | irgendeine Zeichenfolge | |
enableUsernameSuggestions | Ermöglicht Ihnen, Benutzernamenvorschläge zu deaktivieren oder zu aktivieren | WAHR | Boolescher Wert |
erlaubenBenutzernamenÄnderung | Sollten Benutzer in der Lage sein, ihren Benutzernamen zu ändern (nur Benutzeroberfläche)? | WAHR | Boolescher Wert |
enableLoginMessage | Zeigen Sie eine beliebige Nachricht auf der Anmeldeseite an | FALSCH | Boolescher Wert |
loginMessage | Definieren Sie die Meldung, die angezeigt werden soll, wenn „enableLoginMessage“ wahr ist | „“ | irgendeine Zeichenfolge |
Wie bereits erwähnt, benötigen Sie eine MySQL-Datenbank. Die Datenbank benötigt nicht viel Speicherplatz (es sei denn, Sie haben VIELE Benutzer) und jede relativ aktuelle Version von MySQl sollte funktionieren. Sie können Ihre Datenbank einrichten und das Administratorkonto manuell erstellen oder mein automatisches Installationsprogramm verwenden.
Im ersten Schritt der Installation muss das Installationsprogramm eine Datei auf das Laufwerk Ihres Hosts schreiben. Wenn Sie nicht über die entsprechenden Berechtigungen verfügen, müssen Sie die Installation manuell durchführen. Siehe die Anweisungen unten.
users
mit fünf Spalten: username
, password
, accessLevel
, lastLogin
und rememberMeToken
. Verwenden Sie einen String-Datentyp wie CHAR. Ich persönlich verwende gerne VARCHAR. Für den lastLogin
empfehle ich INT(11). Ich würde auch ein automatisch inkrementierendes ID-Feld als Primärschlüssel hinzufügen, aber das ist nicht unbedingt erforderlich.Wenn Sie VARCHAR oder einen anderen Datentyp mit unterschiedlicher maximaler Zeichenfolgenlänge verwenden, ist die folgende Tabelle hilfreich.
Feld | Erforderliche Länge (mindestens) |
---|---|
Benutzername | Identisch mit $usernameMaxLength in config.php |
Passwort | Aus Sicherheitsgründen empfehle ich die Verwendung von 255 (da sich die standardmäßige Verschlüsselungsmethode von PHP ändern kann) |
accessLevel | 5 |
lastLogin | 11 |
RememberMeToken | 255 |
Keine Sorge, so etwas sollte Sie absichern:
CREATE TABLE IF NOT EXISTS users (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
username VARCHAR ( 64 ) NOT NULL UNIQUE,
password VARCHAR ( 255 ) NOT NULL ,
accessLevel VARCHAR ( 10 ) NOT NULL ,
lastLogin INT ( 11 ),
rememberMeToken VARCHAR ( 255 )
);
Nachdem Sie die Datenbank eingerichtet haben, müssen Sie Ihr erstes Administratorkonto erstellen. Dafür gibt es zwei Möglichkeiten:
admin
und einem zufällig generierten Passwort erstellt. (Wenn Sie meinem obigen SQL-Beispiel gefolgt sind und die Einschränkung UNIQUE auf das Feld „Benutzername“ festgelegt haben, wird das Konto nicht erstellt, wenn es bereits vorhanden ist. Sie erhalten keine Fehlermeldung.) Nachdem Sie das Administratorkonto erstellt haben, müssen Sie es entfernen (oder benennen Sie den Ordner /install um). Melden Sie sich abschließend bei dem neu erstellten Konto an und ändern Sie das Passwort über die Kontoverwaltungsseite.ODER
$newAccountAccessLevel
in config/config.php auch vorübergehend auf „admin“ ändern und dann über das normale Registrierungsformular ein neues Konto erstellen. Sie müssen den Ordner /install entfernen, um auf die Anmeldeseite zugreifen zu können. Denken Sie daran, den Wert anschließend wieder auf „Benutzer“ zu ändern.WICHTIG! Ich erinnere Sie noch einmal daran, dass Sie den Ordner /install löschen MÜSSEN , bevor Sie ihn in einer Live-Produktionsumgebung verwenden. Ansonsten kann jeder Ihre Datenbank-Zugangsdaten sehen!
Nach der Einrichtung können Sie über das Admin-Panel neue Konten (Administrator oder normal) erstellen.
Das bedeutet, dass der Installer festgestellt hat, dass die Funktion random_bytes(int)
nicht existiert oder nicht ordnungsgemäß funktioniert. Wenn Sie eine ältere PHP-Version als 7.0 verwenden, müssen Sie eine Drittanbieterbibliothek verwenden, die diese Funktion implementiert. Für PHP 5.x empfehle ich dieses.
Der MySQL-Standard ist 3306.
Dies geschieht, wenn der Assistent sich nicht selbst entfernen kann. Dies wird normalerweise durch einige restriktive Berechtigungen auf dem Host verursacht. Beheben Sie das Problem, indem Sie den Ordner /install manuell entfernen.
Lesen Sie die Tipps zur Fehlerbehebung in den allgemeinen FAQ weiter unten.
Das Admin-Panel befindet sich in einem sehr frühen Entwicklungsstadium. Viele Dinge könnten kaputt sein.
Weitere werden in Zukunft hinzugefügt.
/admin
Lesen Sie config.php genauer durch.
Das bedeutet, dass beim Versuch, eine Verbindung zur Datenbank herzustellen, PDOException
aufgetreten ist. Sie können ausführlichere Fehlermeldungen in /config/config.php aktivieren. Die häufigsten Ursachen sind:
PDO_MYSQL
-Treiber von PHP ist nicht verfügbar oder nicht richtig konfiguriert.PDO_MYSQL
aktivieren. Nein, das ist nicht der Fall und das ist schon viel zu lange her, ich weiß. Ich habe vor, bald damit anzufangen™. Update: Es funktioniert jetzt. Bitte beachten Sie, dass die Anmeldung nur 30 Tage lang gespeichert wird (aus Sicherheitsgründen).
Ja, ich weiß, dass die Implementierung so etwas immer neue Sicherheitslücken eröffnet. Ich zwinge Benutzer jedoch nicht dazu, es zu verwenden oder so. Wenn der Benutzer das Kontrollkästchen nicht aktiviert, wird kein Zugriffstoken erstellt, sodass für diesen Benutzer kein Sicherheitsrisiko besteht.
random_bytes()
ein neues Token erstellt. Dieses Token wird in der Datenbank gespeichert und zwei Cookies werden an den Browser gesendet. Der Wert des ersten Cookies ist der Benutzername des Benutzers als Klartext. Der zweite Cookie ist viel wichtiger. Sein Wert ist der erstellte Token.Das Hauptproblem besteht darin, dass „der Bösewicht“, wenn er irgendwie Zugriff auf das Token des Benutzers erhält, leicht ein Cookie fälschen und sich als dieser Benutzer anmelden kann. Es gibt zwei Möglichkeiten für den Bösewicht, Zugriff auf das Token des Benutzers zu erhalten: Indem er es auf irgendeine Weise (z. B. durch SQL-Injection) aus der Datenbank abruft oder indem er das Cookie und/oder seinen Wert vom Benutzer stiehlt.
Ich halte es für ein Sicherheitsrisiko, da manche Leute dazu neigen würden, zu einfache oder gleiche Passwörter zu verwenden. Allerdings könnte ich dies in zukünftigen Versionen über eine Konfigurationsoption zulassen.