Warum ist es gefährlich, den PHP-Parameter register_globals zu aktivieren? Erstellen eines einfachen Benutzerregistrierungssystems in PHP und MySQL Unpersönliches Index-PHP-Register

Guten Tag! Jetzt werden wir versuchen, die einfachste Registrierung auf der Website mit PHP + MySQL zu implementieren. Dazu muss Apache auf Ihrem Computer installiert sein. Das Funktionsprinzip unseres Skripts ist unten dargestellt.

1. Beginnen wir mit der Erstellung einer Benutzertabelle in der Datenbank. Es enthält Benutzerdaten (Login und Passwort). Gehen wir zu phpmyadmin (wenn Sie eine Datenbank auf Ihrem PC erstellen). http://localhost/phpmyadmin/). Wir erstellen eine Tabelle „users“ mit drei Feldern.

Ich erstelle es in der MySQL-Datenbank, Sie können es in einer anderen Datenbank erstellen. Als nächstes stellen Sie die Werte wie in der Abbildung ein:

2. Eine Verbindung zu dieser Tabelle ist erforderlich. Lassen Sie uns eine bd.php-Datei erstellen. Sein Inhalt:

In meinem Fall sieht es so aus:

Speichern Sie bd.php.
Großartig! Wir haben eine Tabelle in der Datenbank und eine Verbindung dazu. Jetzt können Sie mit der Erstellung einer Seite beginnen, auf der Benutzer ihre Daten hinterlassen.

3. Erstellen Sie eine reg.php-Datei mit dem Inhalt (alle Kommentare darin):



Anmeldung


Anmeldung


Dein Login:




Ihr Passwort:








4. Erstellen Sie eine Datei, die Daten in die Datenbank eingibt und den Benutzer speichert. save_user.php (Kommentare darin):

5. Jetzt können sich unsere Benutzer registrieren! Als nächstes müssen Sie eine „Tür“ erstellen, durch die bereits registrierte Benutzer die Site betreten können. index.php (Kommentare darin):




Hauptseite


Hauptseite


Dein Login:


Ihr Passwort:






Registrieren



OK, jetzt ist alles vorbei! Die Lektion mag langweilig sein, aber sehr nützlich. Hier wird nur die Idee der Registrierung gezeigt, dann können Sie sie verbessern: Sicherheit, Design, Datenfelder hinzufügen, Avatare laden, sich von Ihrem Konto abmelden (dazu einfach Variablen aus der Sitzung mit der Unset-Funktion zerstören) und bald. Viel Glück!

Ich habe alles überprüft, es funktioniert einwandfrei!

Reg.ru: Domains und Hosting

Der größte Registrar und Hosting-Anbieter in Russland.

Mehr als 2 Millionen Domainnamen im Einsatz.

Werbung, Domain-Mail, Geschäftslösungen.

Mehr als 700.000 Kunden auf der ganzen Welt haben bereits ihre Wahl getroffen.

*Bewegen Sie die Maus darüber, um das Scrollen anzuhalten.

Zurück vorwärts

Erstellen eines einfachen Benutzerregistrierungssystems in PHP und MySQL

Die Erstellung eines Registrierungssystems ist eine Menge Arbeit. Sie müssen Code schreiben, der E-Mail-Adressen validiert, eine E-Mail zur Bestätigung der Registrierung sendet, auch andere Formularfelder validiert und vieles mehr.

Und selbst nachdem Sie das alles geschrieben haben, werden Benutzer zögern, sich zu registrieren, weil ... Dies erfordert einige Anstrengungen ihrerseits.

In diesem Tutorial erstellen wir ein sehr einfaches Registrierungssystem, das überhaupt keine Passwörter erfordert oder speichert! Das Ergebnis lässt sich leicht ändern und zu einer vorhandenen PHP-Site hinzufügen. Möchten Sie herausfinden, wie es funktioniert? Lesen Sie weiter unten.



So funktioniert unser supereinfaches System:

Wir werden das Autorisierungsformular und die Registrierung kombinieren. Dieses Formular enthält ein Feld zur Eingabe Ihrer E-Mail-Adresse und eine Registrierungsschaltfläche.
- Wenn Sie das Feld mit einer E-Mail-Adresse ausfüllen, wird durch Klicken auf die Registrierungsschaltfläche ein Datensatz über einen neuen Benutzer erstellt, jedoch nur, wenn die eingegebene E-Mail-Adresse nicht in der Datenbank gefunden wurde.

Anschließend wird ein zufälliger, eindeutiger Zeichensatz (Token) erstellt, der in Form eines 10 Minuten lang relevanten Links an die vom Benutzer angegebene E-Mail-Adresse gesendet wird.
- Der Link führt den Nutzer auf unsere Website. Das System stellt das Vorhandensein eines Tokens fest und autorisiert den Benutzer;

Vorteile dieses Ansatzes:

Es ist nicht erforderlich, Passwörter zu speichern oder Felder zu validieren.
- Es besteht keine Notwendigkeit, Ihr Passwort, Sicherheitsfragen usw. wiederherzustellen;
- Von dem Moment an, in dem sich ein Benutzer registriert/anmeldet, können Sie immer sicher sein, dass sich dieser Benutzer in Ihrer Zugangszone befindet (dass die E-Mail-Adresse wahr ist);
- Unglaublich einfacher Registrierungsprozess;

Mängel:

Sicherheit des Benutzerkontos. Wenn jemand Zugriff auf die E-Mails des Benutzers hat, kann er sich anmelden.
- E-Mails sind nicht sicher und können abgefangen werden. Beachten Sie, dass diese Frage auch dann relevant ist, wenn das Passwort vergessen wurde und wiederhergestellt werden muss, oder in einem Autorisierungssystem, das kein HTTPS für die Datenübertragung (Login/Passwort) verwendet;
- Während Sie Ihren Mailserver richtig konfigurieren, besteht die Möglichkeit, dass Nachrichten mit Autorisierungslinks im Spam landen;

Wenn wir die Vor- und Nachteile unseres Systems vergleichen, können wir sagen, dass das System eine hohe Benutzerfreundlichkeit (maximaler Komfort für den Endbenutzer) und gleichzeitig einen niedrigen Sicherheitsindikator aufweist.

Es wird daher empfohlen, es für Registrierungen in Foren und Diensten zu verwenden, die nicht mit wichtigen Informationen arbeiten.

So verwenden Sie dieses System

Falls Sie nur ein System zur Autorisierung von Benutzern auf Ihrer Website verwenden müssen und diese Lektion nicht in Stücke reißen möchten, müssen Sie Folgendes tun:

Sie müssen die der Lektion beigefügten Quellen herunterladen
- Suchen Sie die Datei tables.sql im Archiv. Importieren Sie sie mit der Importoption in phpMyAdmin in Ihre Datenbank. Alternativer Weg: Öffnen Sie diese Datei mit einem Texteditor, kopieren Sie die SQL-Abfrage und führen Sie sie aus;
- Öffnen Sie Includes/main.php und geben Sie die Einstellungen für die Verbindung mit Ihrer Datenbank ein (geben Sie den Benutzer und das Passwort für die Verbindung mit der Datenbank sowie den Host und den Namen der Datenbank an). In derselben Datei müssen Sie auch die E-Mail-Adresse angeben, die als Originaladresse für vom System gesendete Nachrichten verwendet wird. Einige Hosts blockieren ausgehende E-Mails, es sei denn, das Formular enthält eine echte E-Mail-Adresse, die über das Control Panel des Hosts erstellt wurde. Geben Sie daher eine echte Adresse an.
- Laden Sie alle index.php-, protected.php-Dateien und Assets sowie Ordner per FTP auf Ihren Host hoch;
- Fügen Sie den folgenden Code zu jeder PHP-Seite hinzu, auf der Sie das Anmeldeformular anzeigen möchten.

Require_once „includes/main.php“; $user = neuer Benutzer(); if(!$user->loggedIn())( redirect("index.php"); )
- Bereit!

Für diejenigen, die sich dafür interessieren, wie das alles funktioniert, lesen Sie weiter unten!

Der erste Schritt besteht darin, den HTM-Code für das Autorisierungsformular zu schreiben. Dieser Code befindet sich in der Datei index.php. Diese Datei enthält auch PHP-Code, der Formulardaten und andere nützliche Anmeldesystemfunktionen verarbeitet. Mehr dazu erfahren Sie im folgenden Abschnitt, der der Überprüfung des PHP-Codes gewidmet ist.

index.php

Tutorial: Supereinfaches Registrierungssystem mit PHP und MySQL. Anmelden oder Registrieren

Geben Sie oben Ihre E-Mail-Adresse ein und wir versenden
Sie erhalten einen Login-Link.

Anmeldung Registrieren

Im Kopfbereich (zwischen den und-Tags) habe ich die Hauptstile eingefügt (sie werden in diesem Tutorial nicht behandelt, Sie können sie sich also selbst ansehen. Ordner „assets/css/style.css“). Vor dem schließenden Tag habe ich die jQuery-Bibliothek und die Datei script.js eingefügt, die wir im Folgenden schreiben und analysieren werden.


JavaScript

jQuery verfolgt mithilfe der Funktion den Status der Schaltfläche „Registrieren/Anmelden“. e.preventDefault() und sendet AJAX-Anfragen. Abhängig von der Antwort des Servers zeigt er die eine oder andere Meldung an und bestimmt weitere Aktionen/

asset/js/script.js

$(function())( var form = $("#login-register"); form.on("submit", function(e)( if(form.is(".loading, .loggedIn"))( return false ; ) var email = form.find("input").val(), messageHolder = form.find("span"); e.preventDefault(); $.post(this.action, (email: email), function (m)( if(m.error)( form.addClass("error"); messageHolder.text(m.message); ) else( form.removeClass("error").addClass("loggedIn"); messageHolder . text(m.message); ) )); )); $(document).ajaxStart(function())( form.addClass("loading"); )); $(document).ajaxComplete(function()) ( form. removeClass("loading"); )); ));

wurde dem Formular hinzugefügt, um den aktuellen Status der AJAX-Anfrage anzuzeigen (dies wurde dank der Methoden ermöglicht). ajaxStart()) Und ajaxComplete(), die Sie am Ende der Datei finden).

Diese Klasse zeigt eine sich drehende animierte GIF-Datei an (als ob sie uns darauf hinweisen würde, dass die Anfrage verarbeitet wird) und fungiert auch als Flag, um zu verhindern, dass das Formular erneut gesendet wird (wenn bereits einmal auf die Schaltfläche „Registrieren“ geklickt wurde). Die Klasse .loggedIn ist ein weiteres Flag – sie wird gesetzt, als die E-Mail gesendet wurde. Dieses Flag blockiert sofort alle weiteren Aktionen mit dem Formular.

Datenbankschema

Unser unglaublich einfaches Protokollierungssystem verwendet 2 MySQL-Tabellen (der SQL-Code befindet sich in der Datei tables.sql). Der erste speichert Daten über Benutzerkonten. Der zweite speichert Informationen über die Anzahl der Anmeldeversuche.


Benutzertabellenschema.

Das System verwendet keine Passwörter, wie in der Abbildung zu sehen ist. Darauf sehen Sie die Token-Spalte mit Token neben der token_validity-Spalte. Der Token wird installiert, sobald sich der Benutzer mit dem System verbindet und seine E-Mail-Adresse zum Senden einer Nachricht einstellt (mehr dazu im nächsten Block). Die Spalte token_validity legt die Zeit fest, nach der das Token 10 Minuten später nicht mehr gültig ist.


Tabellenschema, das die Anzahl der Autorisierungsversuche zählt.

In beiden Tabellen wird die IP-Adresse in verarbeiteter Form gespeichert, wobei die Funktion ip2long in einem Feld vom Typ Integer verwendet wird.

Jetzt können wir PHP-Code schreiben. Die Hauptfunktionalität des Systems ist der Klasse User.class.php zugeordnet, die Sie unten sehen können.

Diese Klasse verwendet aktiv Idorm (Dokumente). Diese Bibliotheken sind die minimal notwendigen Werkzeuge für die Arbeit mit Datenbanken. Es übernimmt den Datenbankzugriff, die Token-Generierung und die Token-Validierung. Es bietet eine einfache Schnittstelle, die es einfach macht, ein Registrierungssystem mit Ihrer Site zu verbinden, wenn diese PHP verwendet.

Benutzer.class.php

Class User( // Private ORM case private $orm; /** * Einen Benutzer anhand eines Tokens finden. Es werden nur gültige Tokens zur Prüfung akzeptiert. Das Token wird ab dem Zeitpunkt seiner Erstellung nur für 10 Minuten generiert * @param string $token . Dies ist das gesuchte Token * @return User Gibt den Wert der User-Funktion zurück */ öffentliche statische Funktion findByToken($token)( // Finden Sie das Token in der Datenbank und stellen Sie sicher, dass der richtige Zeitstempel gesetzt ist $result = ORM::for_table("reg_users") ->where ("token", $token) ->where_raw("token_validity > NOW()") ->find_one(); if(!$result)( return false; ) return new User($result); ) /** * Autorisieren oder registrieren Sie einen Benutzer * @param string $email. E-Mail-Adresse des Benutzers * @return User */ public static function loginOrRegister($email)( // Wenn ein solcher Benutzer bereits vorhanden ist Existiert, gibt den Wert der Benutzerfunktion von der angegebenen E-Mail-Adresse zurück, die in der Datenbank gespeichert ist. if(User::exists($email))( return new User($email); ) // Andernfalls erstellen Sie einen neuen Benutzer in der Datenbank und geben Sie den Wert der User::create-Funktion aus der angegebenen E-Mail zurück. return User::create($email ); ) /** * Einen neuen Benutzer erstellen und in der Datenbank speichern * @param string $email. Benutzer-E-Mail-Adresse * @return User */ private static function create($email)( // Einen neuen Benutzer schreiben und das Ergebnis der User-Funktion aus diesen Werten zurückgeben $result = ORM::for_table("reg_users")- >create(); $result->email = $email; $result->save(); return new User($result); ) /** * Überprüfen Sie, ob ein solcher Benutzer in der Datenbank vorhanden ist, und geben Sie den booleschen Wert von zurück die Variable * @param string $email. E-Mail-Adresse des Benutzers * @return boolean */ öffentliche statische Funktion existiert($email)( // Existiert der Benutzer in der Datenbank? $result = ORM::for_table("reg_users") ->where("email", $email ) ->count(); return $result == 1; ) /** * Neues Benutzerobjekt erstellen * @param-Instanz $param ORM, ID, E-Mail oder 0 * @return Benutzer */ öffentliche Funktion __construct($param = null) ( if($param Instanz von ORM)( // ORM-Prüfung bestanden $this->orm = $param; ) else if(is_string($param))( // E-Mail-Prüfung bestanden $this->orm = ORM:: for_table ("reg_users") ->where("email", $param) ->find_one(); ) else( $id = 0; if(is_numeric($param))( // der Wert der Variablen $param ist an die Benutzerkennung übergeben $id = $param; ) else if(isset($_SESSION["loginid"]))( // Ansonsten siehe Sitzung $id = $_SESSION["loginid"]; ) $this->orm = ORM::for_table( "reg_users") ->where("id", $id) ->find_one(); ) ) /** * Erstellt ein neues SHA1-Autorisierungstoken, schreibt es in die Datenbank und gibt seinen Wert zurück * @return string */ public function genericToken( )( // Token für einen autorisierten Benutzer generieren und in der Datenbank speichern $token = sha1($this->email.time().rand(0, 1000000)); // Speichern Sie das Token in der Datenbank // und markieren Sie es nur für die nächsten 10 Minuten als gültig $this->orm->set("token", $token); $this->orm->set_expr("token_validity", "ADDTIME(NOW(),"0:10")"); $this->orm->save(); return $token; ) /** * Autorisieren Sie den Benutzer * @return void */ public function login())( // Markieren Sie den Benutzer als angemeldet $_SESSION["loginid"] = $this->orm->id; // Aktualisieren Sie die Wert des last_login-Datenbankfelds $this->orm->set_expr("last_login", "NOW()"); $this->orm->save(); ) /** * Zerstören Sie die Sitzung und melden Sie den Benutzer ab * @return void */ public function logout ()( $_SESSION = array(); unset($_SESSION); ) /** * Überprüfen Sie, ob der Benutzer angemeldet ist * @return boolean */ public function login())( return isset($this->orm->id) && $_SESSION["loginid"] == $this->orm->id; ) /** * Prüft, ob der Benutzer ein Administrator ist * @return boolean */ public function isAdmin())( return $this->rank() = = "administrator"; ) /** * Finden Sie den Benutzertyp, kann entweder Administrator oder normal sein * @return string */ public function rank())( if ($this->orm->rank == 1)( return "administrator" "; ) return "regular"; ) /** * Methode, die es Ihnen ermöglicht, die privaten Informationen des Benutzers als * Eigenschaften des Benutzerobjekts * abzurufen param string $key Der Name der Eigenschaft, die Zugriff erhält * @return Mixed */ öffentliche Funktion __get($key)( if(isset($this->orm->$key))( return $this->orm-> $key; ) null zurückgeben; ) )

Token werden mithilfe des SHA1-Algorithmus generiert und in der Datenbank gespeichert. Ich verwende die Timing-Funktionen von MySQL, um ein Zeitlimit von 10 Minuten für die Gültigkeit eines Tokens festzulegen.

Wenn ein Token validiert ist, teilen wir dem Handler direkt mit, dass wir nur Token berücksichtigen, die noch nicht abgelaufen sind und in der Spalte token_validity gespeichert sind.

Bitte beachten Sie, dass ich die magische Methode verwende __erhalten docs-Bibliothek am Ende der Datei, um den Zugriff auf die Eigenschaften des Benutzerobjekts abzufangen.

Dadurch wird es möglich, über die Eigenschaften $user->email, $user->token usw. auf die in der Datenbank gespeicherten Informationen zuzugreifen. Im nächsten Codefragment werden wir uns die Verwendung dieser Klassen als Beispiel ansehen .


Geschützte Seite

Eine weitere Datei, die nützliche und notwendige Funktionen speichert, ist die Datei „functions.php“. Es gibt mehrere sogenannte Helfer – Hilfsfunktionen, mit denen Sie saubereren und besser lesbaren Code in anderen Dateien erstellen können.

Funktionen.php

Funktion send_email($from, $to, $subject, $message)( // Helfer, der E-Mails sendet $headers = "MIME-Version: 1.0" . "\r\n"; $headers .= "Content-type: Text /plain; charset=utf-8" . "\r\n"; $headers .= "From: ".$from . "\r\n"; return mail($to, $subject, $message, $headers ); ) function get_page_url())( // URL der PHP-Datei ermitteln $url = "http".(empty($_SERVER["HTTPS"])?":s")."://" .$_SERVER ["SERVER_NAME"]; if(isset($_SERVER["REQUEST_URI"]) && $_SERVER["REQUEST_URI"] != "")( $url.= $_SERVER["REQUEST_URI"]; ) else( $url. = $_SERVER["PATH_INFO"]; ) return $url; ) function rate_limit($ip, $limit_hour = 20, $limit_10_min = 10)( // Anzahl der Anmeldeversuche in der letzten Stunde an dieser IP-Adresse $ count_hour = ORM: :for_table("reg_login_attempt") ->where("ip", sprintf("%u", ip2long($ip))) ->where_raw("ts > SUBTIME(NOW()","1:00 ")") ->count(); // Anzahl der Anmeldeversuche in den letzten 10 Minuten an dieser IP-Adresse $count_10_min = ORM::for_table("reg_login_attempt") ->where("ip", sprintf("%u ", ip2long($ ip))) ->where_raw("ts > SUBTIME(NOW(),"0:10")") ->count(); if($count_hour > $limit_hour || $count_10_min > $limit_10_min)( throw new Exception("Zu viele Anmeldeversuche!"); ) ) function rate_limit_tick($ip, $email)( // Einen neuen Datensatz in der Tabelle erstellen das zählt die Anzahl der Anmeldeversuche $login_attempt = ORM::for_table("reg_login_attempt")->create(); $login_attempt->email = $email; $login_attempt->ip = sprintf("%u", ip2long($ip )); $login_attempt->save(); ) function restart($url)( header("Location: $url"); exit; )

Funktionen Bewertungslimit Und rate_limit_tickÜberwachen Sie die Anzahl der Autorisierungsversuche im Laufe der Zeit seit dem ersten Versuch. Der Anmeldeversuch wird in der Datenbank in der Spalte reg_login_attempt aufgezeichnet. Diese Funktionen werden aufgerufen, wenn die Formulardaten verarbeitet und übermittelt werden, wie Sie dem folgenden Codeausschnitt entnehmen können.

Der folgende Code stammt aus der Datei index.php und übernimmt die Formularübermittlung. Es gibt eine JSON-Antwort zurück, die wiederum von jQuery in der zuvor betrachteten Datei asset/js/script.js verarbeitet wird.

index.php

Try( if(!empty($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))( // Einen JSON-Header ausgeben header("Content-type: application/json"); // Ist diese E-Mail-Adresse gültig, wenn (!isset($_POST["email"]) || !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL))( throw new Exception("Please enter a valid email."); ) // Check. Is the Benutzer darf sich anmelden, hat er die Anzahl der erlaubten Verbindungen überschritten? (Datei „functions.php“ für weitere Informationen) rate_limit($_SERVER["REMOTE_ADDR"]); // Diesen Anmeldeversuch protokollieren rate_limit_tick($_SERVER["REMOTE_ADDR"] , $ _POST["email"]); // Eine E-Mail an den Benutzer senden $message = ""; $email = $_POST["email"]; $subject = "Ihr Login-Link"; if(!User:: existiert($email) )( $subject = "Vielen Dank für Ihre Registrierung!"; $message = "Vielen Dank für Ihre Registrierung auf unserer Website!\n\n"; ) // Versuch, einen Benutzer zu autorisieren oder zu registrieren $user = Benutzer ::loginOrRegister($_POST[ "email"]); $message.= "Sie können sich über diese URL anmelden:\n"; $message.= get_page_url()."?tkn=".$user->generateToken()."\n\n"; $message.= "Der Link läuft automatisch nach 10 Minuten ab."; $result = send_email($fromEmail, $_POST["email"], $subject, $message); if(!$result)( throw new Exception("Beim Senden Ihrer E-Mail ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut."); ) die(json_encode(array("message" => "Vielen Dank! Wir haben einen Link gesendet in Ihren Posteingang. Überprüfen Sie auch Ihren Spam-Ordner."))); ) ) Catch(Exception $e)( die(json_encode(array("error"=>1, "message" => $e->getMessage() ))); )

Nach erfolgreicher Anmeldung/Registrierung sendet der obige Code dem Benutzer einen Anmeldelink. Der Token wird verfügbar, weil Es wird von der Methode als Variable im generierten Link übergeben $_GET mit TKN-Markierung

index.php

If(isset($_GET["tkn"]))( // Ist dieses Token für die Autorisierung gültig? $user = User::findByToken($_GET["tkn"]); if($user)( // Ja, ist. Weiterleiten zu einer geschützten Seite $user->login(); restart("protected.php"); ) // Nein, das Token ist ungültig. Weiterleiten zu einer Seite mit einem Autorisierungs-/Registrierungsformular restart("index. php"); )

$user->login()

erstellt die notwendigen Variablen für die Sitzung, sodass der Benutzer beim Betrachten nachfolgender Seiten der Website jederzeit berechtigt bleibt.

Die Abarbeitung der Funktion zum Verlassen des Systems erfolgt analog.

index.php

If(isset($_GET["logout"]))( $user = new User(); if($user->loggedIn())( $user->logout(); ) restart("index.php") ; )

Am Ende des Codes setze ich noch einmal eine Weiterleitung auf index.php, also den Parameter ?logout=1 Eine Übermittlung per URL ist nicht erforderlich.

Unsere Datei index.php erfordert zusätzliche. Schutz – wir möchten nicht, dass Personen, die sich im System angemeldet haben, das Registrierungsformular erneut sehen. Für diese Zwecke nutzen wir die Methode $user->loggedIn().

index.php

$user = neuer Benutzer(); if($user->loggedIn())( redirect("protected.php"); )

Abschließend finden Sie hier einen Code, der es Ihnen ermöglicht, die Seiten Ihrer Website zu schützen und sie nur nach Autorisierung zugänglich zu machen.

protected.php

// Um ​​jede Seite Ihrer Website zu schützen, fügen Sie eine main.php-Datei ein // und erstellen Sie ein neues Benutzerobjekt. So einfach ist es! require_once "includes/main.php"; $user = neuer Benutzer(); if(!$user->loggedIn())( redirect("index.php"); )

Nach dieser Prüfung können Sie sicher sein, dass der Benutzer erfolgreich autorisiert wurde. Sie können auch über Objekteigenschaften auf gespeicherte Informationen in der Datenbank zugreifen $Benutzer. Verwenden Sie diesen Code, um die E-Mail-Adresse und den Status des Benutzers anzuzeigen:

Echo „Ihre E-Mail:“.$user->email; echo "Ihr Rang: ".$user->rank();

Methode Rang() wird hier verwendet, weil die Datenbank normalerweise Zahlen speichert (0 für einen normalen Benutzer, 1 für einen Administrator) und wir diese Daten in die Status umwandeln müssen, zu denen sie gehören, und dabei hilft uns diese Methode.

Um einen regulären Benutzer zum Administrator zu machen, bearbeiten Sie einfach den Benutzereintrag über phpMyAdmin (oder ein anderes Programm, mit dem Sie Datenbanken verwalten können). Der Administratorstatus gewährt keine Privilegien; in diesem Beispiel wird auf der Seite angezeigt, dass Sie ein Administrator sind – und das war’s.

Aber was Sie damit machen, liegt in Ihrem Ermessen; Sie können selbst Code schreiben und komponieren, der bestimmte Privilegien und Fähigkeiten für Administratoren festlegt.

Wir sind fertig!

Wir sind fertig mit dieser unglaublich supereinfachen Form! Sie können es in Ihren PHP-Sites verwenden, es ist ganz einfach. Sie können es auch selbst ändern und nach Ihren Wünschen gestalten.

Das Material wurde von Denis Malyshok speziell für die Website vorbereitet

P.S. Möchten Sie PHP und OOP besser beherrschen? Achten Sie auf Premium-Lektionen zu verschiedenen Aspekten der Website-Erstellung, einschließlich Programmierung in PHP, sowie einen kostenlosen Kurs zum Erstellen Ihres eigenen CMS-Systems in PHP von Grund auf mit OOP:

Hat Ihnen das Material gefallen und Sie möchten sich bei mir bedanken?
Teilen Sie es einfach mit Ihren Freunden und Kollegen!


Da sehr häufig Fragen zu globalen Variablen und Problemen im Zusammenhang mit der Deaktivierung der Anweisung „register_globals“ auftauchen, werden wir versuchen, dieses Thema in diesem Artikel ein wenig zu behandeln.

Lassen Sie uns zunächst definieren, was externe Variablen sind. Dabei handelt es sich um beliebige Variablen, die von außen in das Programm gelangen, d.h. sind nicht im Programm selbst definiert. Bei einem PHP-Skript sind alle Variablen, die über die Browserzeile oder das Formular übergeben werden, extern.
Schauen wir uns an, wie sie entstehen.

Wenn die Direktive „register_globals = On“ auf dem Server (in php.ini) aktiviert ist, werden sie beim Übergeben von Variablen über ein Formular oder über eine Browserzeile in dem Skript, für das diese Variablen bestimmt sind, automatisch erstellt. Diese. Wenn Sie in Ihrer Browserzeile Folgendes geschrieben haben: www.server.ru/index.php?var=1, dann wird die Variable $var mit einem Wert gleich 1 automatisch im Skript index.php erstellt.

Kommentar

Diese Direktive ist einer der umstrittensten Punkte in der PHP-Sprache. Einerseits kann seine Verwendung tatsächlich zu echten Problemen beim Schutz von PHP-Skripten führen, wenn mögliche Fehlersituationen nicht richtig berücksichtigt werden, und viele Entwickler stellen zu Recht fest, dass das Schreiben von Skripten ohne Verwendung globaler Variablen die Anfälligkeit von Skripten verringert verschiedene Arten von Angriffen um 90 %. Andererseits vertrauten zu Beginn von PHP mehr als eintausend Benutzer den Sprachentwicklern (bis PHP 4.3 war diese Anweisung standardmäßig aktiviert), weshalb es derzeit Millionen von tatsächlich funktionierenden Skripten gibt, die mit globalen Variablen geschrieben wurden (Es ist so). Es ist erwähnenswert, dass es sich für Bildungszwecke manchmal völlig lohnt, Skripte mit globalen Variablen zu schreiben, da deren Ersetzung durch superglobale Arrays die Lesbarkeit des Codes erheblich beeinträchtigt.

Derzeit ist diese Anweisung bei den meisten Hostanbietern aktiviert und wird wahrscheinlich noch lange aktiviert bleiben, da sonst die Codekontinuität unterbrochen werden könnte.

Wenn die Direktive register_globals deaktiviert ist, ist der Zugriff auf solche Variablen auf zwei Arten möglich:

  • über assoziative Arrays HTTP_***_VARS (HTTP_POST_VARS, etc.)
  • über superglobale Arrays ($_ENV, $_GET, $_POST, $_SERVER, $_COOKIE, $_FILES usw.)

Superglobale Arrays sind in jedem Umfang verfügbar. PHP-Entwickler empfehlen, die Direktive register_globals auf dem Server zu deaktivieren und mit Variablen über superglobale Arrays zu arbeiten. Diese Empfehlung ist auf Sicherheitsprobleme zurückzuführen, die auftreten können, wenn die Direktive „register_globals“ aktiviert ist.

Allerdings blieb die Anweisung register_globals bis vor Kurzem auf Hosting-Sites aktiviert. Die Situation begann sich mit der Veröffentlichung von PHP 5 zu ändern, wo diese Direktive standardmäßig deaktiviert ist und Hoster es nicht eilig haben, sie zu aktivieren (vielleicht zu Recht).

Was genau sollten Sie also tun, um Variablen zu erhalten? Sie müssen sie aus superglobalen Arrays übernehmen. Um beispielsweise Variablen abzurufen, die über die Browserzeile übergeben werden, verwenden Sie das Array $_GET. Nehmen wir an, in der Browserzeile steht www.server.ru/index.php?var=1. Um dann die Variable var in index.php zu erhalten, müssen Sie Folgendes schreiben:

$var=$_GET["var"];

Und um beispielsweise Variablen zu empfangen, die von einem Formular mit der POST-Methode übertragen wurden, müssen Sie im Formular-Handler-Skript Folgendes schreiben:

$var=$_POST["var"];

In diesem Artikel erfahren Sie, wie Sie mit HTML, JavaScript, PHP und MySql ein Registrierungs- und Anmeldeformular erstellen. Solche Formulare werden auf fast jeder Website verwendet, unabhängig von der Art. Sie werden für ein Forum, einen Online-Shop, soziale Netzwerke (wie Facebook, Twitter, Odnoklassniki) und viele andere Arten von Websites erstellt.

Wenn Sie eine Website auf Ihrem lokalen Computer haben, hoffe ich, dass bereits ein lokaler Server installiert ist und läuft. Ohne sie geht nichts.

Erstellen einer Tabelle in der Datenbank

Um die Benutzerregistrierung umzusetzen, benötigen wir zunächst eine Datenbank. Wenn Sie es bereits haben, ist das großartig, andernfalls müssen Sie es erstellen. Im Artikel erkläre ich ausführlich, wie das geht.

Wir haben also eine Datenbank (abgekürzt als DB), jetzt müssen wir eine Tabelle erstellen Benutzer in dem wir unsere registrierten Benutzer hinzufügen.

Ich habe im Artikel auch erklärt, wie man eine Tabelle in einer Datenbank erstellt. Bevor wir eine Tabelle erstellen, müssen wir bestimmen, welche Felder sie enthalten soll. Diese Felder entsprechen den Feldern aus dem Registrierungsformular.

Also dachten wir, stellten uns vor, welche Felder unser Formular haben würde, und erstellten eine Tabelle Benutzer mit diesen Feldern:

  • Ausweis- Kennung. Feld Ausweis Jede Tabelle in der Datenbank sollte es haben.
  • Vorname- Um den Namen zu speichern.
  • Familienname, Nachname- Um den Nachnamen zu bewahren.
  • Email- Um die Postanschrift zu speichern. Wir werden E-Mail als Login verwenden, daher muss dieses Feld eindeutig sein, d. h. den Index UNIQUE haben.
  • email_status- Feld zur Angabe, ob die E-Mail bestätigt ist oder nicht. Wenn die E-Mail bestätigt ist, hat sie den Wert 1, andernfalls ist der Wert 0.
  • Passwort- Um das Passwort zu speichern.


Wenn Sie möchten, dass Ihr Registrierungsformular weitere Felder enthält, können Sie diese auch hier hinzufügen.

Das ist er, unser Tisch Benutzer bereit. Kommen wir zur nächsten Stufe.

Datenbankverbindung

Wir haben die Datenbank erstellt, jetzt müssen wir uns mit ihr verbinden. Wir werden uns mit der PHP-Erweiterung MySQLi verbinden.

Erstellen Sie im Ordner unserer Website eine Datei mit dem Namen dbconnect.php, und schreiben Sie das folgende Skript hinein:

Diese Datei dbconnect.php müssen mit Formularhandlern verbunden werden.

Beachten Sie die Variable $address_site, hier habe ich den Namen meiner Testseite angegeben, an der ich arbeiten werde. Bitte geben Sie den Namen Ihrer Website entsprechend an.

Site-Struktur

Schauen wir uns nun die HTML-Struktur unserer Website an.

Wir werden die Kopf- und Fußzeile der Website in separate Dateien verschieben. header.php Und footer.php. Wir werden sie auf allen Seiten einbinden. Nämlich auf der Hauptseite (Datei index.php), zur Seite mit dem Anmeldeformular (Datei form_register.php) und auf die Seite mit dem Autorisierungsformular (Datei form_auth.php).

Blockieren Sie mit unseren Links, Anmeldung Und Genehmigung, fügen Sie sie dem Site-Header hinzu, damit sie auf allen Seiten angezeigt werden. Ein Link führt zur Seite mit dem Registrierungsformular (Datei form_register.php) und die andere auf die Seite mit dem Autorisierungsformular (Datei form_auth.php).

Inhalt der Datei header.php:

Name unserer Website

Im Ergebnis sieht unsere Hauptseite so aus:


Natürlich kann Ihre Seite auch eine völlig andere Struktur haben, aber das ist für uns jetzt nicht wichtig. Hauptsache, es gibt Links (Buttons) zur Registrierung und Autorisierung.

Kommen wir nun zum Anmeldeformular. Wie Sie bereits wissen, haben wir es in den Akten form_register.php.

Gehen Sie zur Datenbank (in phpMyAdmin) und öffnen Sie die Tabellenstruktur Benutzer und schauen Sie sich an, welche Felder wir brauchen. Das bedeutet, dass wir Felder zur Eingabe des Vor- und Nachnamens, ein Feld zur Eingabe der Postadresse (E-Mail) und ein Feld zur Eingabe des Passworts benötigen. Und aus Sicherheitsgründen werden wir ein Feld zur Eingabe eines Captchas hinzufügen.

Auf dem Server können infolge der Verarbeitung des Registrierungsformulars verschiedene Fehler auftreten, aufgrund derer sich der Benutzer nicht registrieren kann. Damit der Benutzer versteht, warum die Registrierung fehlschlägt, ist es daher erforderlich, Meldungen zu diesen Fehlern anzuzeigen.

Fügen Sie vor der Anzeige des Formulars einen Block hinzu, um Fehlermeldungen aus der Sitzung anzuzeigen.

Und noch etwas: Wenn der Benutzer bereits autorisiert ist und aus Neugier direkt zur Registrierungsseite gelangt, indem er in die Adressleiste des Browsers schreibt site_address/form_register.php, dann zeigen wir in diesem Fall anstelle des Registrierungsformulars eine Kopfzeile an, die besagt, dass er bereits registriert ist.

Im Allgemeinen der Dateicode form_register.php wir haben das:

Du bist bereits registriert

Im Browser sieht die Seite mit dem Anmeldeformular so aus:


Mithilfe des erforderlichen Attributs haben wir alle Felder zu Pflichtfeldern gemacht.

Achten Sie auf den Code des Registrierungsformulars, in dem das Captcha angezeigt wird:


Wir haben den Pfad zur Datei im Wert des src-Attributs für das Bild angegeben captcha.php, wodurch dieses Captcha generiert wird.

Schauen wir uns den Dateicode an captcha.php:

Der Code ist gut kommentiert, daher werde ich mich nur auf einen Punkt konzentrieren.

Innerhalb einer Funktion imageTtfText(), wird der Pfad zur Schriftart angegeben verdana.ttf. Damit das Captcha ordnungsgemäß funktioniert, müssen wir einen Ordner erstellen Schriftarten, und platzieren Sie die Schriftartdatei dort verdana.ttf. Sie können es im Internet finden und herunterladen oder mit den Materialien dieses Artikels aus dem Archiv entnehmen.

Wir sind mit der HTML-Struktur fertig, es ist Zeit, weiterzumachen.

Überprüfung der E-Mail-Gültigkeit mit jQuery

Jedes Formular muss die Gültigkeit der eingegebenen Daten überprüfen, sowohl auf der Clientseite (mit JavaScript, jQuery) als auch auf der Serverseite.

Besonderes Augenmerk müssen wir auf das E-Mail-Feld legen. Es ist sehr wichtig, dass die eingegebene Postanschrift gültig ist.

Für dieses Eingabefeld legen wir den E-Mail-Typ (type="email") fest, dieser warnt uns leicht vor falschen Formaten. Dies reicht jedoch nicht aus, denn über den Code-Inspektor, den uns der Browser zur Verfügung stellt, können wir den Attributwert problemlos ändern Typ Mit Email An Text, und das war's, unser Scheck ist nicht mehr gültig.


Und in diesem Fall müssen wir eine zuverlässigere Prüfung durchführen. Dazu verwenden wir die jQuery-Bibliothek von JavaScript.

Um die jQuery-Bibliothek zu verbinden, in der Datei header.php zwischen Tags , vor dem schließenden Tag , fügen Sie diese Zeile hinzu:

Unmittelbar nach dieser Zeile fügen wir den E-Mail-Validierungscode hinzu. Hier fügen wir einen Code hinzu, um die Länge des eingegebenen Passworts zu überprüfen. Die Länge muss mindestens 6 Zeichen betragen.

Mithilfe dieses Skripts überprüfen wir die eingegebene E-Mail-Adresse auf Gültigkeit. Wenn der Benutzer eine falsche E-Mail-Adresse eingegeben hat, zeigen wir eine entsprechende Fehlermeldung an und deaktivieren die Schaltfläche zum Absenden des Formulars. Wenn alles in Ordnung ist, beheben wir den Fehler und aktivieren den Formular-Senden-Button.

Damit sind wir mit der Formularvalidierung auf Kundenseite fertig. Jetzt können wir es an den Server senden, wo wir auch ein paar Prüfungen durchführen und Daten zur Datenbank hinzufügen.

Benutzer Registration

Wir senden das Formular zur Bearbeitung an die Datei registrieren.php, über die POST-Methode. Der Name dieser Handlerdatei wird im Attributwert angegeben Aktion. Und die Sendemethode wird im Attributwert angegeben Methode.

Öffnen Sie diese Datei registrieren.php Und das erste, was wir tun müssen, ist, eine Sitzungsstartfunktion zu schreiben und die zuvor erstellte Datei zu verbinden dbconnect.php(In dieser Datei haben wir eine Verbindung zur Datenbank hergestellt). Lassen Sie uns außerdem sofort die Zellen deklarieren Fehlermeldungen Und success_messages im globalen Sitzungsarray. IN error_messages Wir erfassen alle Fehlermeldungen, die während der Formularverarbeitung auftreten, und in succes_messages, wir werden freudige Botschaften aufzeichnen.

Bevor wir fortfahren, müssen wir prüfen, ob das Formular überhaupt übermittelt wurde. Ein Angreifer kann sich den Attributwert ansehen Aktion aus dem Formular und finden Sie heraus, welche Datei dieses Formular verarbeitet. Und vielleicht kommt ihm die Idee, direkt zu dieser Datei zu gelangen, indem er die folgende Adresse in die Adressleiste des Browsers eingibt: http://site_address/register.php

Daher müssen wir im globalen POST-Array nach einer Zelle suchen, deren Name mit dem Namen unserer Schaltfläche „Registrieren“ aus dem Formular übereinstimmt. Dadurch prüfen wir, ob der Button „Registrieren“ angeklickt wurde oder nicht.

Versucht ein Angreifer direkt auf diese Datei zuzugreifen, erhält er eine Fehlermeldung. Ich möchte Sie daran erinnern, dass die Variable $address_site den Namen der Site enthält und in der Datei deklariert wurde dbconnect.php.

Der Captcha-Wert in der Sitzung wurde bei der Generierung in der Datei hinzugefügt captcha.php. Zur Erinnerung zeige ich Ihnen diesen Code aus der Datei noch einmal captcha.php, wobei der Captcha-Wert zur Sitzung hinzugefügt wird:

Fahren wir nun mit der Verifizierung selbst fort. Im Ordner registrieren.php, innerhalb des if-Blocks, wo wir prüfen, ob auf die Schaltfläche „Registrieren“ geklickt wurde, bzw. wo der Kommentar „ angegeben ist“ // (1) Platz für den nächsten Codeabschnitt"wir schreiben:

//Überprüfen Sie das empfangene Captcha //Entfernen Sie die Leerzeichen am Anfang und Ende der Zeile $captcha = trim($_POST["captcha"]); if(isset($_POST["captcha"]) && !empty($captcha))( //Vergleiche den empfangenen Wert mit dem Wert aus der Sitzung. if(($_SESSION["rand"] != $captcha) && ($_SESSION ["rand"] != ""))( // Wenn das Captcha nicht korrekt ist, kehren wir den Benutzer zur Registrierungsseite zurück und zeigen ihm dort eine Fehlermeldung an, dass er das falsche Captcha eingegeben hat . $error_message = "

Fehler! Sie haben das falsche Captcha eingegeben

"; // Fehlermeldung in der Sitzung speichern. $_SESSION["error_messages"] = $error_message; // Den Benutzer zur Registrierungsseite zurückbringen header("HTTP/1.1 301 Moved Permanently"); header("Location: " .$address_site ."/form_register.php"); //Stoppen Sie das Skript exit(); ) // (2) Platz für den nächsten Codeabschnitt )else( //Wenn das Captcha nicht übergeben wird oder leer ist, beenden Sie den Vorgang ("

Fehler! Es gibt keinen Verifizierungscode, also einen Captcha-Code. Sie können zur Hauptseite gehen.

"); }

Als nächstes müssen wir die empfangenen Daten vom POST-Array verarbeiten. Zunächst müssen wir den Inhalt des globalen POST-Arrays prüfen, also ob es dort Zellen gibt, deren Namen mit den Namen der Eingabefelder aus unserem Formular übereinstimmen.

Wenn die Zelle vorhanden ist, schneiden wir die Leerzeichen am Anfang und Ende der Zeile dieser Zelle ab. Andernfalls leiten wir den Benutzer zurück auf die Seite mit dem Registrierungsformular.

Als nächstes, nachdem wir die Leerzeichen gekürzt haben, fügen wir die Zeile zur Variablen hinzu und prüfen, ob diese Variable leer ist. Wenn sie nicht leer ist, fahren wir fort, andernfalls leiten wir den Benutzer zurück auf die Seite mit dem Registrierungsformular.

Fügen Sie diesen Code an der angegebenen Stelle ein. // (2) Platz für den nächsten Codeabschnitt".

/* Überprüfen Sie, ob vom Formular gesendete Daten im globalen Array $_POST vorhanden sind, und packen Sie die übermittelten Daten in reguläre Variablen.*/ if(isset($_POST["first_name"]))( //Leerzeichen vom Anfang abschneiden und Ende der Zeichenfolge $first_name = trim($_POST["first_name"]); //Überprüfen Sie die Variable auf Leere if(!empty($first_name))( // Konvertieren Sie zur Sicherheit Sonderzeichen in HTML-Entitäten $first_name = htmlspecialchars($first_name, ENT_QUOTES) ; )else( // Fehlermeldung in der Sitzung speichern. $_SESSION["error_messages"] .= "

Gib deinen Namen ein

Das Namensfeld fehlt

"; //Den Benutzer zur Registrierungsseite zurückbringen header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //Das Skript stoppen exit(); ) if( isset($_POST["last_name"]))( // Leerzeichen am Anfang und Ende der Zeile abschneiden $last_name = trim($_POST["last_name"]); if(!empty($last_name)) ( // Aus Sicherheitsgründen Sonderzeichen in HTML-Entitäten umwandeln $last_name = htmlspecialchars($last_name, ENT_QUOTES); )else( // Fehlermeldung in der Sitzung speichern. $_SESSION["error_messages"] .= "

Bitte geben Sie ihren Nachnamen ein

"; //Den Benutzer zur Registrierungsseite zurückbringen header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //Das Skript stoppen exit(); ) )else ( // Fehlermeldung in der Sitzung speichern. $_SESSION["error_messages"] .= "

Das Feld „Nachname“ fehlt

"; //Den Benutzer zur Registrierungsseite zurückbringen header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //Das Skript stoppen exit(); ) if( isset($_POST["email"]))( //Leerzeichen am Anfang und Ende der Zeile kürzen $email = trim($_POST["email"]); if(!empty($email)) ( $email = htmlspecialchars ($email, ENT_QUOTES); // (3) Codespeicherort zum Überprüfen des Formats der E-Mail-Adresse und ihrer Eindeutigkeit )else( // Speichern Sie die Fehlermeldung in der Sitzung. $_SESSION["error_messages"] .= "

Geben sie ihre E-Mail Adresse ein

"; //Den Benutzer zur Registrierungsseite zurückbringen header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //Das Skript stoppen exit(); ) )else ( // Fehlermeldung in der Sitzung speichern. $_SESSION["error_messages"] .= "

"; //Den Benutzer zur Registrierungsseite zurückbringen header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //Das Skript stoppen exit(); ) if( isset($_POST["password"]))( // Leerzeichen am Anfang und Ende der Zeichenfolge kürzen $password = trim($_POST["password"]); if(!empty($password)) ( $password = htmlspecialchars ($password, ENT_QUOTES); //Das Passwort verschlüsseln $password = md5($password."top_secret"); )else( // Fehlermeldung in der Sitzung speichern. $_SESSION["error_messages"] .= "

Geben Sie Ihr Passwort ein

"; //Den Benutzer zur Registrierungsseite zurückbringen header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //Das Skript stoppen exit(); ) )else ( // Fehlermeldung in der Sitzung speichern. $_SESSION["error_messages"] .= "

"; //Den Benutzer zur Registrierungsseite zurückbringen header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //Das Skript stoppen exit(); ) // (4) Platz für den Code zum Hinzufügen eines Benutzers zur Datenbank

Von besonderer Bedeutung ist das Feld Email. Wir müssen das Format der empfangenen Postanschrift und ihre Einzigartigkeit in der Datenbank überprüfen. Das heißt, gibt es einen Benutzer mit derselben E-Mail-Adresse, der bereits registriert ist?

Am angegebenen Ort“ // (3) Code-Standort zur Überprüfung des Formats der Postanschrift und ihrer Eindeutigkeit" Fügen Sie den folgenden Code hinzu:

//Überprüfen Sie das Format der empfangenen E-Mail-Adresse mithilfe eines regulären Ausdrucks $reg_email = "/^**@(+(*+)*\.)++/i"; //Wenn das Format der empfangenen E-Mail-Adresse nicht mit dem regulären Ausdruck übereinstimmt if(!preg_match($reg_email, $email))( // Fehlermeldung in der Sitzung speichern. $_SESSION["error_messages"] .= "

Sie haben eine falsche E-Mail-Adresse eingegeben

"; //Den Benutzer zur Registrierungsseite zurückbringen header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //Das Skript stoppen exit(); ) // Wir prüfen, ob eine solche Adresse bereits in der Datenbank vorhanden ist. $result_query = $mysqli->query("SELECT `email` FROM `users` WHERE `email`="".$email."""); / /Wenn die Anzahl der empfangenen Daten genau eine Zeile beträgt, bedeutet dies, dass der Benutzer mit dieser E-Mail-Adresse bereits registriert ist if($result_query->num_rows == 1)( //Wenn das resultierende Ergebnis nicht falsch ist if(($row = $result_query->fetch_assoc()) != false) ( // Fehlermeldung in der Sitzung speichern. $_SESSION["error_messages"] .= "

Ein Benutzer mit dieser E-Mail-Adresse ist bereits registriert

"; //Den Benutzer zur Registrierungsseite zurückbringen header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); )else( // Fehlermeldung speichern zur Sitzung . $_SESSION["error_messages"] .= "

Fehler bei der Datenbankabfrage

"; //Den Benutzer zur Registrierungsseite zurückbringen header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); ) /* Schließen der Auswahl */ $ result_query->close(); //Stoppen Sie das Skript exit(); ) /* Schließen der Auswahl */ $result_query->close();

Nachdem wir alle Prüfungen abgeschlossen haben, ist es an der Zeit, den Benutzer zur Datenbank hinzuzufügen. Am angegebenen Ort“ // (4) Platz für den Code zum Hinzufügen eines Benutzers zur Datenbank" Fügen Sie den folgenden Code hinzu:

//Abfrage zum Hinzufügen eines Benutzers zur Datenbank $result_query_insert = $mysqli->query("INSERT INTO `users` (first_name, last_name, email, password) VALUES ("".$first_name."", "".$last_name ." ", "".$email.", "".$password."")"); if(!$result_query_insert)( // Fehlermeldung in der Sitzung speichern. $_SESSION["error_messages"] .= "

Fehler bei der Anfrage zum Hinzufügen eines Benutzers zur Datenbank

"; //Den Benutzer zur Registrierungsseite zurückbringen header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //Das Skript stoppen exit(); )else( $_SESSION["success_messages"] = "

Registrierung erfolgreich abgeschlossen!!!
Jetzt können Sie sich mit Ihrem Benutzernamen und Passwort anmelden.

"; //Sende den Benutzer zur Autorisierungsseite header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_auth.php"); ) /* Abschließen der Anfrage */ $ result_query_insert->close(); //Verbindung zur Datenbank schließen $mysqli->close();

Wenn bei der Anfrage zum Hinzufügen eines Benutzers zur Datenbank ein Fehler aufgetreten ist, fügen wir der Sitzung eine Nachricht über diesen Fehler hinzu und leiten den Benutzer zur Registrierungsseite zurück.

Andernfalls, wenn alles gut gelaufen ist, fügen wir der Sitzung auch eine Nachricht hinzu, aber dieses Mal ist es angenehmer, nämlich dass wir dem Benutzer mitteilen, dass die Registrierung erfolgreich war. Und wir leiten es auf die Seite mit dem Autorisierungsformular weiter.

Das Skript zur Überprüfung des E-Mail-Adressformats und der Passwortlänge befindet sich in der Datei header.php, daher gilt es auch für Felder aus diesem Formular.

Die Sitzung wird auch in der Datei gestartet header.php, also in der Datei form_auth.php Es ist nicht erforderlich, eine Sitzung zu starten, da sonst eine Fehlermeldung angezeigt wird.


Wie bereits erwähnt, funktioniert hier auch das Skript zur Überprüfung des E-Mail-Adressformats und der Passwortlänge. Wenn der Benutzer daher eine falsche E-Mail-Adresse oder ein falsches Kurzpasswort eingibt, erhält er sofort eine Fehlermeldung. Ein Knopf betreten wird inaktiv.

Nach Behebung der Fehler erscheint die Schaltfläche betreten wird aktiv und der Benutzer kann das Formular an den Server senden, wo es verarbeitet wird.

Benutzerautorisierung

Wert zuschreiben Aktion Für das Berechtigungshandicap ist eine Datei angegeben auth.php, bedeutet dies, dass das Formular in dieser Datei verarbeitet wird.

Öffnen Sie also die Datei auth.php und schreiben Sie Code, um das Autorisierungsformular zu verarbeiten. Als Erstes müssen Sie eine Sitzung starten und die Datei verbinden dbconnect.php um eine Verbindung zur Datenbank herzustellen.

Wenn Sie auf der Website auf den Exit-Link klicken, werden wir zu einer Datei weitergeleitet logout.php, wobei wir einfach die Zellen mit der E-Mail-Adresse und dem Passwort aus der Sitzung zerstören. Danach kehren wir den Nutzer zurück zu der Seite, auf der der Link angeklickt wurde Ausfahrt.

Dateicode logout.php:

Das ist alles. Jetzt wissen Sie, wie Sie Benutzerregistrierungs- und Autorisierungsformulare auf Ihrer Website implementieren und verarbeiten. Diese Formulare sind auf fast jeder Website zu finden, daher sollte jeder Programmierer wissen, wie man sie erstellt.

Wir haben auch gelernt, wie man Eingabedaten validiert, sowohl auf der Clientseite (im Browser, mit JavaScript, jQuery) als auch auf der Serverseite (mit PHP). Wir haben auch gelernt, wie man ein Verfahren zum Verlassen der Website implementiert.

Alle Skripte wurden getestet und funktionieren. Sie können das Archiv mit den Dateien dieser kleinen Site über diesen Link herunterladen.

In Zukunft werde ich einen Artikel schreiben, in dem ich beschreiben werde. Und ich habe auch vor, einen Artikel zu schreiben, in dem ich es erklären werde (ohne die Seite neu zu laden). Um über die Veröffentlichung neuer Artikel auf dem Laufenden zu bleiben, können Sie meine Website abonnieren.

Wenn Sie Fragen haben, wenden Sie sich bitte an mich. Wenn Ihnen im Artikel ein Fehler auffällt, teilen Sie mir dies bitte mit.

Unterrichtsplan (Teil 5):

  • Erstellen einer HTML-Struktur für das Autorisierungsformular
  • Wir verarbeiten die erhaltenen Daten
  • Wir zeigen die Begrüßung des Benutzers im Site-Header an
  • Hat Ihnen der Artikel gefallen?

    Ich weiß nicht warum ... nein, ich weiß, warum Sie die Direktive register_globals nicht aktivieren können, aber ich weiß nicht, warum in der Literatur in der Regel nichts darüber gesagt wird.

    In diesem Artikel werde ich versuchen, alle, die darin sitzen, aus dem Panzer zu holen und zu erklären, was was ist (insbesondere für diejenigen im Panzerzug – Anm. d. Red.). Nicht umsonst deaktivieren einige Hoster diese Richtlinie. Also…

    Wie es funktioniert

    In den PHP-Einstellungen (php.ini-Datei) gibt es eine solche register_globals-Direktive. Das bedeutet, dass, wenn es aktiviert ist (register_globals = on), alle über GET und POST übergebenen Variablen automatisch als global registriert werden. Was bedeutet das?

    Beispielsweise übergeben wir der GET-Methode einen Seitenwert an das index.php-Skript: index.php?page=2. Der übergebene Wert wird in einem GET-Array gespeichert und kann in einem Skript als $_GET["page"] verwendet werden. Wenn wir jedoch register_globals aktiviert haben, wird für den übergebenen Wert eine $page-Variable erstellt, die in jedem Teil des index.php-Skripts verfügbar ist.

    Eine kleine Zusammenfassung und Ergänzung. Wenn register_globals aktiviert ist, werden drei Kopien der Variablen erstellt: im GET-Array, im GLOBALS-Array und einfach die Variable selbst ($_GET["page"], $GLOBALS["page"], $page), while Wenn register_globals deaktiviert ist, kann auf den übergebenen Wert nur über das GET-Array ($_GET["page"]) zugegriffen werden. Erinnern.

    Gebrauchsgefahr

    Schauen wir uns ein einfaches Beispiel an, um zu verstehen, was uns erwartet (von 3 bis 5 Jahren – Anmerkung der Redaktion). Der Einfachheit halber sage ich gleich, dass $login und $password Variablen sind, die von der GET/POST-Methode übergeben werden.

    Kurz über die Funktionsweise des Skripts:

      Zeile 2. Wir stellen eine Anfrage an die Datenbank, um das echte Passwort für den vom Benutzer eingegebenen Login abzurufen.

      Zeile 3. Wir erhalten dieses Passwort und weisen es der Variablen $real_pass zu.

      Zeile 4. Wir vergleichen das echte und das eingegebene Passwort und wenn sie übereinstimmen, wird der Variablen $check true zugewiesen.

      Zeilen 5-8. Wenn $check wahr ist, schreiben wir, dass die Autorisierung erfolgreich war usw.

    Das vorgeschlagene Szenario ist per Definition das undichteste der Welt, und jetzt werde ich Ihnen diese Lücken zeigen. Bedingung: register_globals ist aktiviert.

    Nehmen wir an, die Übertragung erfolgt mit der GET-Methode. Dann sieht die URL etwa so aus:
    www.site.com/index.php?login =admin&password =qwerty
    Es ist klar, dass die globalen Variablen $login und $password sofort erstellt werden. Schauen Sie sich nun das Skript an. Es enthält die Variable $check. Was ist, wenn Sie es per URL übergeben?

    www.site.com/index.php?login =admin&password =qwerty&check =1
    Dann wird die Passwortübereinstimmungsprüfung umgangen und der Benutzer wird sofort autorisiert (erinnern Sie sich schließlich daran, dass 1 wahr und 0 falsch ist?). Das gleiche Ergebnis wird auftreten, wenn wir schreiben www.Website.com/Index.PHP?überprüfen =1 . Und selbst wenn Sie die POST-Methode verwenden, funktionieren alle derartigen Betrügereien trotzdem, denn wenn register_globals aktiviert ist, spielt es keine Rolle, welche Methode Sie verwenden – GET oder POST.

    Ich glaube, jemand hat eine Frage: Woher weiß ein Cracker von der Prüfvariablen, dass sie für alles verantwortlich ist? Wenn Sie das Skript niemandem gezeigt haben, ist es unwahrscheinlich, dass jemand es kennt. Allerdings verwendet nicht jeder seine eigenen Skripte, CMS usw., sondern nutzt das, was im Netzwerk verfügbar ist. In solchen Fällen kann beispielsweise ein Cracker den CMS-Code studieren und mit seiner Hilfe erstellte Websites angreifen.

    Allerdings deaktivieren nicht alle Hoster register_globals, und selbst wenn Ihre Skripte so konzipiert sind, dass register_globals nicht aktiviert ist, kann ein Cracker Ihr Skript dennoch hacken, indem er die Schwachstelle dieser Direktive ausnutzt.

    Nehmen wir unser Beispiel. Um es zu schützen, falls register_globals aktiviert ist, nach der Zeile wenn ($Passwort==$real_bestehen)$check =WAHR; füge Folgendes hinzu: sonst$check =FALSCH;. Selbst wenn in diesem Fall die Prüfvariable gleich eins von der GET-Methode übergeben wird, setzt das Skript dennoch $check=false, wenn das Passwort falsch ist.

    Ja, ich möchte Sie auch darauf aufmerksam machen, dass unser Beispiel nicht funktioniert, wenn Sie register_globals deaktivieren. Und damit es funktioniert, müssen Sie $login = $_POST["login"]; $password = $_POST["password"];

    Fassen wir es zusammen...

    und ziehe zwei wesentliche Schlussfolgerungen:

    1) Wenn register_globals aktiviert ist, können Sie verschiedene Variablen, deren Werte nicht berechnet wurden, per GET oder POST empfangen.

    2) Register_globals selbst ist nicht so gefährlich wie ein krumm geschriebenes Skript.

    Das ist alles für heute! Ich freue mich sehr über Ihre Kommentare, Anmerkungen, Vorschläge und einfach Ihr Feedback. Schreiben Sie deshalb, seien Sie nicht schüchtern!

    Mit Wünschen für eine erfolgreiche Woche,
    Alexander SHUYSKY