kostenloser Webspace werbefrei: lima-city


Registrierungsseite mit PhP & MySQL 2

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    h***********r

    Hallo zurück,
    da ich leider weder auf den letzten Post in dem dazugehörigen Thread antworten noch ihn ändern kann, schreibe ich einfach mal hier weiter. Evtl verschiebt ein Moderator das dann an seinen Platz :)
    Original gibt es hier:
    https://www.lima-city.de/thread/registrierungsseite-mit-php-mysql/page%3A0/perpage%3A15#1174713



    Ich wäre jetzt soweit mit dem Tutorial von @strange fertig, wie machen wir jetzt am besten weiter?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Nun zuerst möchte ich nocheinmal am rande darauf hinweisen das es schon gute tutorials zu dem thema gibt und verlinke hier, wie einer deiner Helfer in deinem alten Thread mal die seite: http://de.wikihow.com/Ein-sicheres-Login-Skript-mit-PHP-und-MySQL-erstellen

    Nun aber zu deinen Geposteten Skripten.
    Als aller erstes muss ich dir sagen das du oftmals mysql_query vergessen hast, um eine sqlabfrage überhaupt zu starten:
    function logincheck($username, $password){
    	include_once 'sql.php';
    	$loginstatus = "SELECT allow_login FROM login WHERE username='$username'"; //falsch
    
    	$loginstatus = mysql_query("SELECT allow_login FROM login WHERE username='$username'"); //richtig
    	//...
    }


    Auch wenns nur im PHP code ist würde ich zumindest das password auch nicht von der Datenbank lesen sondern lediglich vergleichen, aber das ist wohl Geschmackssache...

    (und ich hoffe mal das password_verify auch existiert und du es nur nicht gepostet hast um deinen Identifizierungscode nicht öffentlich zu machen... xD)

    Ein tipp zu deiner $_SESSION speicherung: es ist IMMER ein hohes sicherheitsrisiko das passwort roh und direkt im browser zu speichern. Ich würde zu einem login_token system raten, sowie cookie bzw session daten nur gehasht (+salt) vom server an den clienten zu übertragen.

    Ansonsten sehe ich vorerst keine lücken bzw fehler, zudem will ich dir ja auch keine vorlage geben die du stumpf abschreibst ;)
  4. Autor dieses Themas

    h***********r

    Ok, vielen Dank :)

    habe jetzt überall wo mysql im Einsatz ist die mysql_query hinzugefügt.
    Ich teste gerade mal aus ob das so geht :)

    reg-ister.php

    <?php
    session_start();
    include 'sql.php';
    	if (isset($_POST['submit'])) {
    		$username = $_POST['username'];
    		$password = $_POST['password'];
    		$name = $_POST['name'];
    		$email = $_POST['email'];
    		checkset($username, $password, $name, $email);
    	}
    
    	function checkset ($username, $password, $name, $email){
    		if (isset($_SESSION['username'])) {
    			if (isset($_SESSION['password'])) {
    				if (isset($_SESSION['name'])) {
    					if (isset($_SESSION['email'])) {
    						register-check1($username, $password, $name, $email);
    		}	}	}	}
    					else {
    						echo "<div id='loginmsg'>Du musst eine Email eingeben!</div>";
    					}
    				else {
    						echo "<div id='loginmsg'>Du musst einen Namen eingeben!</div>";
    					}
    			else {
    						echo "<div id='loginmsg'>Du musst einen Passwort eingeben!</div>";
    					}
    		else {
    						echo "<div id='loginmsg'>Du musst einen Benutzernamen eingeben!</div>";
    					}
    	}
    	
    	function register-check1($username, $password, $name, $email){
    		include_once 'sql.php';
    		$userexist = mysql_query("SELECT * FROM login WHERE username='$username'");
    		$userexisty = mysql_query($userexist) or die("<div class='loginmsg'>Ein Fehler ist aufgetreten<div>");
    
    		if (mysql_num_rows($userexisty) == 1) {
    			echo "<div id='loginmsg'>Benutzername bereits vergeben</div>";
    		}
    		else{
    			register-check2($username, $password, $name, $email);
    		}
    	}
    	
    	function register-check2($username, $password, $name, $email){
    		include_once 'sql.php';
    		$emailexist = mysql_query("SELECT * FROM login WHERE email='$email'");
    		$emailexisty = mysql_query($userexist) or die("<div class='loginmsg'>Ein Fehler ist aufgetreten<div>");
    
    		if (mysql_num_rows($emailexisty) == 1) {
    			echo "<div id='loginmsg'>Diese Email-Adresse wurde bereits registriert.</div>";
    		}
    		else{
    			register($username, $password, $name, $email);
    		}
    	}
    	
    	function register($username, $password, $name, $email){
    		$hash = mysql_query("password_hash($password, PASSWORD_BCRYPT)");
    		
    		INSERT INTO 'benutzer' ('name', 'username', 'password', 'email', 'allow_login') VALUES ($name, $username, $hash, $email, yes);
    		echo "<div id='loginmsg'>Registrierung erfolgreich!</div>";
    	}
    ?>



    log-in.php
    <?php
    session_start();
    include 'sql.php';
    	if (isset($_POST['submit'])) {
    		$username = $_POST['username'];
    		$password = $_POST['password'];
    		usernamecheck($username, $password);
    	}
    
    	function usernamecheck($username, $password){
    		include_once 'sql.php';
    		$grabusername = mysql_query("SELECT * FROM login WHERE username='$username'");
    		$grabusernamek = mysql_query($grabusername) or die("<div class='loginmsg'>Ein Fehler ist aufgetreten<div>");
    
    		if (mysql_num_rows($grabusernamek) == 1) {
    			passwordhash($username, $password);
    		}
    		else{
    			echo "<div id='loginmsg'>Benutzername oder Passwort falsch</div>";
    		}
    	}
    
    	function passwordhash($username, $password){
    	include_once 'sql.php';
    	$hash = mysql_query("SELECT password FROM login WHERE username='$username'");
    
    	if (password_verify($password, $hash)) {
       		logincheck($username);
    	} 	
    	else {
    		echo "<div id='loginmsg'>Benutzername oder Passwort falsch</div>"; 
    	}
    	}
    
    	function logincheck($username, $password){
    	include_once 'sql.php';
    		$loginstatus = mysql_query("SELECT allow_login FROM login WHERE username='$username'");
    
    		if ($loginstatus == 'yes') {
    			header('location: member.php');
    		}
    		else{
    			echo "<div id='loginmsg'>Du darfst dich hier nicht anmelden.</div>";
    		}
    	}
    ?>


    Leider geht das nicht, bei den Dateien bekomme ich immer nen 500er fehler (500)


    Beitrag zuletzt geändert: 26.6.2017 20:34:50 von horstexplorer
  5. michaelkoepke

    michaelkoepke hat kostenlosen Webspace.

    horstexplorer schrieb:
    Ich teste gerade mal aus ob das so geht :)


    Es wird vielleicht gehen, aber ...
    Ich erinnere mich dunkel, du wolltest Hilfe von uns und hast fast NULL von dem umgesetzt von dem was dir geraten wurde!

    Was meine ich?

    keine zumindest mysqli_* Funktionen,
    keine Überprüfung der Eingaben,
    nicht durchdachte und mehrfach ausgeführte SQL-Abfragen,
    warum speicherst du bei einem Reg-Form etwas in einer Session?, usw. ...

    Wenn du dir Überlegungen dazu gemacht hast und das Geforderte umgesetzt hast, wird dir hier vielleicht auch geholfen.

    MFG Micha
  6. Autor dieses Themas

    h***********r

    OK gut, dann werde ich da nochmal bei den Punkten nacharbeiten. Das mit den mehrfach SQL Abfragen und überprüfen der Eingaben baue ich auf jeden Fall noch ein.
    Ich frage mich nur was an mysqli_* Funktionen besser bzw anders ist als an mysql_* bzw was ich da sonderlich beachten muss wie ich das anwende?

    Beitrag zuletzt geändert: 26.6.2017 21:16:03 von horstexplorer
  7. michaelkoepke

    michaelkoepke hat kostenlosen Webspace.

    horstexplorer schrieb:
    Ich frage mich nur was an mysqli_* Funktionen besser bzw anders ist als an mysql_* bzw was ich da sonderlich beachten muss wie ich das anwende?

    Zum Nachlesen:
    http://php.net/manual/de/function.mysql-connect.php
    https://serpentsembrace.wordpress.com/2011/03/04/phpmysql-mehr-sicherheit-und-erhohte-performance-durch-mysqli-und-prepared-statements/

    Die Syntax ist bei beiden ähnlich, schau in die Doku von php, da gibt es viele Beispiele.
    http://php.net/manual/de/book.mysqli.php

    Viel Spaß

    Beitrag zuletzt geändert: 26.6.2017 21:29:58 von michaelkoepke
  8. Autor dieses Themas

    h***********r

    OK, wenn ich das richtig sehe müsste ich also folgende Funktionen austauschen:
    mysql_num_rows("") --> mysqli_stmt::$num_rows("")
    mysql_query("") --> mysqli::query("")
    Und halt im Login für die Datenbank
    mysql_connect("") --> mysqli::real_connect("")
    mysql_select_db("") --> mysqli::select_db("")

    Habe ich etwas übersehen?
  9. Und da sind wir wieder, an exakt derselben Stelle an der wir beim letzten mal aufgehört haben. Statt sich mit den Themen zu befassen die wir dir in dem anderem Thread vorgeschlagen haben, machst du immer noch die selben Fehler und wunderst dich warum der Code A nicht funktioniert oder B von uns als absolut unsicher eingestuft wird.

    horstexplorer schrieb:
    OK, wenn ich das richtig sehe müsste ich also folgende Funktionen austauschen:
    mysql_num_rows("") --> mysqli_stmt::$num_rows("")
    mysql_query("") --> mysqli::query("")
    Und halt im Login für die Datenbank
    mysql_connect("") --> mysqli::real_connect("")
    mysql_select_db("") --> mysqli::select_db("")

    Habe ich etwas übersehen?

    Dies hier ist das perfekte Beispiel warum du dich noch nicht mit Logins befassen, sondern ersteinmal lernen solltest was MySQLi überhaupt ist und warum es gegenüber den veralteten MySQL Funktionen bevorzugt wird. Eine simple suche nach "php mysqli" hat mir ca. 18,400,000 Ergebnisse geliefert, da sollte bestimmt was passendes für dich dabei sein.

    Auf die Gefahr hin mich wie ein kaputter Plattenspieler, das Ding was es vor der CD gab, anzuhören. Sage ich dir nocheinmal: Befasse dich mit den Basics! Logik Strukturen (if/else/switch), Formular Verarbeitung, PHP Best Practises und so weiter. Mache kleine Schritte die deinem aktuellem Wissen entsprechen. Nutze das gelernte um kleinere Skripts zu erstellen die ein wenig über deinen aktuellen Wissensstand hinaus gehen...

    Man kann dies noch ins unendliche weiterspinnen, aber dafür haben wir alle keine Zeit. Wenn du programmieren lernen willst, musst du auch lernen dir die Informationen selber zu beschaffen, statt dir alles vorkauen zu lassen. Denn darauf läuft das hier alles hin... und darauf hat hier sehr wahrscheinlich niemand lust. Zumal es mehrere millionen Tutorials im Netz gibt, die sich mit genau diesem Thema befassen.
  10. michaelkoepke

    michaelkoepke hat kostenlosen Webspace.

    Fast :)
    Der Connect beispielsweise wäre
    new mysqli([...]);
    Das ist die objektorientierte Profgrammierung von mysqli.

    Da du Anfänger bist, rate ich dir Funktionen zu nutzen (also zu einer prozeduralen Programmierung) und später in die objektorientierte Programmierung einzusteigen.

    Bsp:
    $link = mysqli_connect("localhost", " ****USER**** ", " ****PASS**** ", " ****DB**** ");
    
    /* Verbunden? */
    if (mysqli_connect_errno()) {
        echo 'Fehler: ' . mysqli_connect_error();
        exit();
    }
    
    /* SQL Abfrage */
    $query = "SELECT password FROM login WHERE username='?';";
    
    /* Start SQL Statement */
    if ($stmt = mysqli_prepare($link, $query)) {
    
        /* Binde Parameter $username (s=String) an das ? */
        mysqli_stmt_bind_param($stmt, 's', $username);
    
        /* Ausführen der Abfrage */
        mysqli_stmt_execute($stmt);
    
        /* Binde Ausgabe von mysql (password) an $pass */
        mysqli_stmt_bind_result($stmt, $pass);
    
        /* Ausgabe was gefunden wurde */
        while (mysqli_stmt_fetch($stmt)) {
            echo $username . ' : ' . $pass;
        }
    
        /* Schließe SQL Statement */
        mysqli_stmt_close($stmt);
    }
    
    /* Beende Mysql Verbindung */
    mysqli_close($link);
    (Zu finden u.a. hier: http://php.net/manual/de/mysqli-stmt.fetch.php)

    Viel Spaß beim Verstehen und Anwenden auf dein Login und Registrierung
  11. michaelkoepke schrieb:
    Da du Anfänger bist, rate ich dir Funktionen zu nutzen (also zu einer prozeduralen Programmierung) und später in die objektorientierte Programmierung einzusteigen.

    Warum sollte sich ein Anfänger nicht auch direkt mit OOP auseinander setzen sollen?
    Wenn er erst mal nur mit prozeduralen Programmierung arbeitet wird er sich bei OOP um so schwieriger tun. Lieber gleich mit beiden Themen auseinander setzen.
  12. michaelkoepke

    michaelkoepke hat kostenlosen Webspace.

    muellerlukas schrieb:
    Warum sollte sich ein Anfänger nicht auch direkt mit OOP auseinander setzen sollen?
    Wenn er erst mal nur mit prozeduralen Programmierung arbeitet wird er sich bei OOP um so schwieriger tun. Lieber gleich mit beiden Themen auseinander setzen.

    Ich weiß nicht wie du programmieren gelernt hast, aber ich habe mit prozeduraler Programmierung begonnen und konnte somit die Logik dahinter leicht verstehen. Eigene Skripte und Programme auf dieser Basis konnte ich leicht umsetzten.

    Später im Anfangsstadium meines Studiums kam oop dazu. Die Erkenntnisse aus meinem Studium sind folgende.

    Jemand der noch nie oder wenig programmiert hat, dem fehlt die Logik dahinter. Und genau diejenigen hatten es in diesem Modul sehr schwer sich oop anzueignen. Für mich, mit meinem damaligen Wissensstand, war es hingegen sehr einfach.

    Wenn du der Meinung bist er solle sich sofort oop ansehen, ohne die grundlegende Logik der prozeduralen Programmierung zu verstehen wäre es natürlich sehr hilfreich wenn du ihm zumindest den Unterschied zwischen der Initialisierung eines Objektes und den Unterschied zwischen "mysql_query("") --> mysqli::query("")" erklären kannst.

    MFG Micha
  13. Autor dieses Themas

    h***********r

    Ich hoffe ich habe jetzt alles so umgesetzt wie es sein sollte.
    mysqli_* Funktionen sollten drinnen sein & Sonderzeichen (" ' # , . ? ! > < =)werden aus der Eingabe entfernt.

    log-in.php
    <?php
    session_start();
    include 'sql.php';
    	//Setzen der Variablen
    	if (isset($_POST['submit'])) {
    		$username = $_POST['username'];
    		$password = $_POST['password'];
    		checkinput($username, $password);
    	}
    	//Entfernen von Sonderzeichen
    	function checkinput($username, $password){
    		$bad = array("*",'"',"'",'#',',','.','?','!','>','<','=');
    		$good = //Soll mit nichts ersetzt werden
    		$username = str_replace($bad, $good, $username);
    		$password = str_replace($bad, $good, $password);
    		usernamecheck ($username, $password);
    	}
    	//Überprüfen ob Benutzername vergeben ist
    	function usernamecheck ($username, $password){
    		include_once 'sql.php';
    		$grabusername = "SELECT * FROM member WHERE username='$username'";
    		$grabusernamek = mysqli_query($db, $grabusername) or die("<div class='loginmsg'>Ein Fehler ist aufgetreten<div>");
    		if (mysqli_num_rows($grabusernamek) == 1) {
    			mysqli_close($connect);
    			passwordhash($username, $password);
    		}
    		else{
    			echo "<div id='loginmsg'>Benutzername oder Passwort falsch</div>";
    			mysqli_close($connect);
    		}
    	}
    	//Umwandeln des Passworts in einen Hashwert u abgleichen
    	function passwordhash ($username, $password){
    		include_once 'sql.php';
    		//Hohlen des Hashs
    		$hash = "SELECT password FROM member WHERE username='$username'";
    		$hashk= mysqli_query($db, $hash);
    		//Vergleichen
    		if (password_verify($password, $hashk)) {
    			logincheck($username, $password);
    			mysqli_close($connect);
    		}
    		else {
    			echo "<div id='loginmsg'>Benutzername oder Passwort falsch</div>";
    			mysqli_close($connect);
    		}
    	}
    	//Überprüfen ob sich der Benutzer anmelden darf
    	function logincheck ($username, $password){
    		include_once 'sql.php';
    		$loginstatus = "SELECT allow_login FROM member WHERE username='$username'";
    		$loginstatusk= mysqli_query($db, $loginstatus);
    		mysqli_close($connect);
    		if ($loginstatusk == 'yes') {
    			$_SESSION['username'] = $username;
    			header('location: member.php');
    		}
    		else{
    			echo "<div id='loginmsg'>Du darfst dich hier nicht anmelden.</div>";
    		}
    	}
    ?>


    sql.php

    <?php
    
    	$host = 'localhost';
    	$user = 'benutzer';
    	$db = 'CloudInc';
    	$pass = 123456';
    
    $connect = @mysqli_connect($host, $user, $pass) or die('Database could not connect');
    $select = @mysqli_select_db($connect, $db) or die('Database could not select');
    ?>


    reg-ister.php

    <?php
    session_start();
    include 'sql.php';
    	//Setzen der Variablen
    	if (isset($_POST['submit'])) {
    		$username = $_POST['username'];
    		$password = $_POST['password'];
    		$name = $_POST['name'];
    		$email = $_POST['email'];
    		checkset($username, $password, $name, $email);
    	}
    	//Überprüfen ob Variable gesetzt ist
    	function checkset($username, $password, $name, $email){
    		$notsetcount = 0; //Bei fehlern soll dieser Wert erhöht werden.
    		if (isset($username)){$notsetcount = $notsetcount + 0;}
    		else { $notsetcount = $notsetcount + 1;}
    		if (isset($name)){$notsetcount = $notsetcount + 0;}
    		else { $notsetcount = $notsetcount + 1;}
    		if (isset($password)){$notsetcount = $notsetcount + 0;}
    		else { $notsetcount = $notsetcount + 1;}
    		if (isset($email)){$notsetcount = $notsetcount + 0;}
    		else { $notsetcount = $notsetcount + 1;}
    		//Überprüfen des Werts von $notsetcount 
    		if ($notsetcount === 0){ checkinput($username, $password, $name, $email);}
    		else {echo "<div id='loginmsg'>Bitte kontrolliere deine Eingabe.</div>";}
    	}
    	//Entfernen von Sonderzeichen
    	function checkinput($username, $password, $name, $email){
    		$bad = array("*",'"',"'",'#',',','?','!','>','<','=');
    		$good = //Soll mit nichts ersetzt werden
    		$username = str_replace($bad, $good, $username);
    		$password = str_replace($bad, $good, $password);
    		$name = str_replace($bad, $good, $name);
    		$email = str_replace($bad, $good, $email);
    		checkmail ($username, $password, $name, $email);
    	}
    	//Überprüfen ob bei Email eine gültige Email-Adresse ist.
    	function checkmail ($username, $password, $name, $email){
    		if (filter_var($email, FILTER_VALIDATE_EMAIL)) {checkdb ($username, $password, $name, $email);}
    		else {echo "<div id='loginmsg'>Die Email-Adresse ist ungültig.</div>";}
    	}
    	//Überprüfen ob der Benutzername und oder die Email bereits benutzt wurden.
    	function checkdb ($username, $password, $name, $email){
    		include_once 'sql.php';
    		$dbcounter = 0;
    		//Benutzernamen überprüfen
    		$checkusername = "SELECT * FROM login WHERE username='$username'";
    		$checkusernamek = mysqli_query($db, $checkusername) or die("<div class='loginmsg'>Ein Fehler ist aufgetreten<div>");
    		if (mysqli_num_rows($checkusernamek) == 1){$dbcounter = $dbcounter + 1;}
    		else {$dbcounter = $dbcounter + 0;}
    		//Email überprüfen
    		$checkmail = "SELECT * FROM login WHERE username='$username'";
    		$checkmailk = mysqli_query($db, $checkusername) or die("<div class='loginmsg'>Ein Fehler ist aufgetreten<div>");
    		if (mysqli_num_rows($checkmailk) == 1){$dbcounter = $dbcounter + 1;}
    		else {$dbcounter = $dbcounter + 0;}
    		mysqli_close($connect);
    		//$dbcounter überprüfen
    		if ($dbcounter === 0){ register($username, $password, $name, $email);}
    		else {echo "<div id='loginmsg'>Benutzername oder Email bereits registriert.</div>";}
    	}
    	//Generieren des Hashwerts + Einfügen der Daten
    	function register($username, $password, $name, $email){
    		//Erzeugen des Hashwerts
    		$hash = password_hash($password, PASSWORD_BCRYPT);
    		//Einfügen in Datenbank
    		include_once 'sql.php';
    		$insertsql = "INSERT INTO 'benutzer' ('name', 'username', 'password', 'email', 'allow_login') VALUES ($name, $username, $hash, $email, yes)";
    		$insertsqlk = mysqli_query($db, insertsql)or die("<div class='loginmsg'>Ein Fehler ist aufgetreten<div>");
    		echo "<div id='loginmsg'>Registrierung erfolgreich!</div>";
    	}
    ?>



    Ich habe gerade angefangen die Seite zu testen. Dabei treten leider noch einige Fehler auf. Bei der log-in.php Seite und reg-ister.php Seite bekommt man den Fehler "Ein Fehler ist aufgetreten" angezeigt.

    Beitrag zuletzt geändert: 27.6.2017 20:56:45 von horstexplorer
  14. Hi ^^

    Ich beginne mal ohne großem Geschwafel mit der Hilfe:

    log-in.php:
    $good = //Soll mit nichts ersetzt werden

    Wird dir einen fehler ausspucken, da 1. die variable keinen wert zugewiesen bekommt und 2. kein Semikolon existiert.

    reg-ister.php:
    Deine funktion checkset ist unnötig komplex. Um eine nicht gesetzte variable zu prüfen reicht
    if(!isset($username)) {
      //code ausführen wenn $username nicht exisitiert oder NULL ist
    }


    Desweiteren ist es kein feiner zug einfach so den usernamen oder das Passwort zu überschreiben. Wenn du mal dir gängige login-Systeme bzw. Registrierungsformulare ansiehst, wirst du bemerken das bei einem Fehler der Registrierungsvorgang abgebrochen wird und dem Nutzer gesagt wird das etwas an seinem usernamen / passwort falsch ist. Ein kleines Beispiel:
    Ich nehme z.b. den Nutzername
    #Nutzer?!

    Sowie das Passwort
    Passwort><.

    In beidem sind bad-zeichen enthalten, deine Website löscht diese und erstellt somit den Nutzer
    Nutzer
    mit dem Passwort
    Passwort
    , und fährt fort. Ich als Nutzer habe davon nichts mitbekommen und versuche mich anzumelden... zack kein Zugriff da ich als außenstehender Nutzer davon ausgehe das mein Passwort
    Passwort><.
    ist. Deshalb bei Fehlern abbrechen und dem Benutzer bescheid sagen das was nicht stimmt.

    Desweiteren wäre es für eventuelle weitere Hilfen gut zu wissen was in password_verify vor sich geht. Denn dort könnte auch eine große Fehlerquelle sitzen. Dies ist lediglich ein Vorschlag um die Hilfe zu verbessern, du bist nicht gezwungen alle Teile deines Sourcecodes offenzulegen wenn du das nicht möchtest ^^.

    Hoffe ich konnte dir helfen und noch eine gute nacht, naja wobei es ist ja schon fast 2... xD

    Beitrag zuletzt geändert: 28.6.2017 2:00:53 von itgenie98
  15. Autor dieses Themas

    h***********r

    Danke sehr :)
    Ich hoffe ich habe das so richtig umgesetzt. Bei dem replace gibt es sicher einen leichteren Weg :) Dabei ersetze ich die Sonderzeichen gehen 42 und überprüfe dann ob beide Werte gleich sind. Sind keine Sonderzeichen drinn sollte der Wert ja gleich Wert sein. Wenn aber welche (We"r#t -> We42r42t ) vorhanden sind ist die originale Eingabe nicht gleich mit der bearbeiteten.

    reg-ister.php
    <?php
    session_start();
    include 'sql.php';
    	//Setzen der Variablen
    	if (isset($_POST['submit'])) {
    		$username = $_POST['username'];
    		$password = $_POST['password'];
    		$name = $_POST['name'];
    		$email = $_POST['email'];
    		checkset($username, $password, $name, $email);
    	}
    	//Überprüfen ob Variable gesetzt ist
    	function checkset($username, $password, $name, $email){
    		$notsetcount = 0; //Bei fehlern soll dieser Wert erhöht werden.
    		if (!isset($username)){$notsetcount = $notsetcount + 1;}
    		if (!isset($name)){$notsetcount = $notsetcount + 1;}
    		if (!isset($password)){$notsetcount = $notsetcount + 1;}
    		if (!isset($email)){$notsetcount = $notsetcount + 1;}
    		//Überprüfen des Werts von $notsetcount 
    		if ($notsetcount === 0){ checkinput($username, $password, $name, $email);}
    		else {echo "<div id='loginmsg'>Bitte kontrolliere deine Eingabe.</div>";}
    	}
    	//Entfernen von Sonderzeichen
    	function checkinput($username, $password, $name, $email){
    		$bad = array("*",'"',"'",'#',',','?','!','>','<','=',']','[','(',')','{','}');
    		$good = '42';
    		$badw = 0;
    		$usernamerlc = str_replace($bad, $good, $username);
    		$passwordrlc = str_replace($bad, $good, $password);
    		$namerlc = str_replace($bad, $good, $name);
    		$emailrlc = str_replace($bad, $good, $email);
    		if ($username !== $usernamerlc){$badw = $badw + 1;}
    		if ($name !== $unamerlc){$badw = $badw + 1;}
    		if ($password !== $passwordrlc){$badw = $badw + 1;}
    		if ($email !== $emailrlc){$badw = $badw + 1;}
    		if ($badl === 0){ checkmail ($username, $password, $name, $email);}
    		else {echo "<div id='loginmsg'>Die Eingabe darf folgende Zeichen nicht beinhalten: ("*",'"',"'",'#',',','?','!','>','<','=',']','[','(',')','{','}')</div>";}
    	}
    	//Überprüfen ob bei Email eine gültige Email-Adresse ist.
    	function checkmail ($username, $password, $name, $email){
    		if (filter_var($email, FILTER_VALIDATE_EMAIL)) {checkdb ($username, $password, $name, $email);}
    		else {echo "<div id='loginmsg'>Die Email-Adresse ist ungültig.</div>";}
    	}
    	//Überprüfen ob der Benutzername und oder die Email bereits benutzt wurden.
    	function checkdb ($username, $password, $name, $email){
    		include_once 'sql.php';
    		$dbcounter = 0;
    		//Benutzernamen überprüfen
    		$checkusername = "SELECT * FROM login WHERE username='$username'";
    		$checkusernamek = mysqli_query($db, $checkusername) or die("<div class='loginmsg'>Ein Fehler ist aufgetreten<div>");
    		if (mysqli_num_rows($checkusernamek) == 1){$dbcounter = $dbcounter + 1;}
    		else {$dbcounter = $dbcounter + 0;}
    		//Email überprüfen
    		$checkmail = "SELECT * FROM login WHERE username='$username'";
    		$checkmailk = mysqli_query($db, $checkusername) or die("<div class='loginmsg'>Ein Fehler ist aufgetreten<div>");
    		if (mysqli_num_rows($checkmailk) == 1){$dbcounter = $dbcounter + 1;}
    		else {$dbcounter = $dbcounter + 0;}
    		mysqli_close($connect);
    		//$dbcounter überprüfen
    		if ($dbcounter === 0){ register($username, $password, $name, $email);}
    		else {echo "<div id='loginmsg'>Benutzername oder Email bereits registriert.</div>";}
    	}
    	//Generieren des Hashwerts + Einfügen der Daten
    	function register($username, $password, $name, $email){
    		//Erzeugen des Hashwerts
    		$hash = password_hash($password, PASSWORD_BCRYPT);
    		//Einfügen in Datenbank
    		include_once 'sql.php';
    		$insertsql = "INSERT INTO 'benutzer' ('name', 'username', 'password', 'email', 'allow_login') VALUES ($name, $username, $hash, $email, yes)";
    		$insertsqlk = mysqli_query($db, insertsql)or die("<div class='loginmsg'>Ein Fehler ist aufgetreten<div>");
    		echo "<div id='loginmsg'>Registrierung erfolgreich!</div>";
    	}
    ?>


    log-in.php
    <?php
    session_start();
    include 'sql.php';
    	//Setzen der Variablen
    	if (isset($_POST['submit'])) {
    		$username = $_POST['username'];
    		$password = $_POST['password'];
    		checkinput($username, $password);
    	}
    	//Entfernen von Sonderzeichen
    	function checkinput($username, $password){
    		$bad = array("*",'"',"'",'#',',','?','!','>','<','=',']','[','(',')','{','}');
    		$good = '42';
    		$badw = 0;
    		$usernamerlc = str_replace($bad, $good, $username);
    		$passwordrlc = str_replace($bad, $good, $password);
    		if ($username !== $usernamerlc){$badw = $badw + 1;}
    		if ($password !== $passwordrlc){$badw = $badw + 1;}
    		if ($badl === 0){ usernamecheck ($username, $password, $name, $email);}
    		else {echo "<div id='loginmsg'>Die Eingabe darf folgende Zeichen nicht beinhalten: ("*",'"',"'",'#',',','?','!','>','<','=',']','[','(',')','{','}')</div>";}
    	}
    	}
    	//Überprüfen ob Benutzername vergeben ist
    	function usernamecheck ($username, $password){
    		include_once 'sql.php';
    		$grabusername = "SELECT * FROM member WHERE username='$username'";
    		$grabusernamek = mysqli_query($db, $grabusername) or die("<div class='loginmsg'>Ein Fehler ist aufgetreten<div>");
    		if (mysqli_num_rows($grabusernamek) == 1) {
    			mysqli_close($connect);
    			passwordhash($username, $password);
    		}
    		else{
    			echo "<div id='loginmsg'>Benutzername oder Passwort falsch</div>";
    			mysqli_close($connect);
    		}
    	}
    	//Umwandeln des Passworts in einen Hashwert u abgleichen
    	function passwordhash ($username, $password){
    		include_once 'sql.php';
    		//Hohlen des Hashs
    		$hash = "SELECT password FROM member WHERE username='$username'";
    		$hashk= mysqli_query($db, $hash);
    		//Vergleichen
    		if (password_verify($password, $hashk)) {
    			logincheck($username, $password);
    			mysqli_close($connect);
    		}
    		else {
    			echo "<div id='loginmsg'>Benutzername oder Passwort falsch</div>";
    			mysqli_close($connect);
    		}
    	}
    	//Überprüfen ob sich der Benutzer anmelden darf
    	function logincheck ($username, $password){
    		include_once 'sql.php';
    		$loginstatus = "SELECT allow_login FROM member WHERE username='$username'";
    		$loginstatusk= mysqli_query($db, $loginstatus);
    		mysqli_close($connect);
    		if ($loginstatusk == 'yes') {
    			$_SESSION['username'] = $username;
    			header('location: member.php');
    		}
    		else{
    			echo "<div id='loginmsg'>Du darfst dich hier nicht anmelden.</div>";
    		}
    	}
    ?>



    Beitrag zuletzt geändert: 28.6.2017 11:33:07 von horstexplorer
  16. reg-ister.php Zeile 37:
    log-in.php Zeile 20:
    Innerhalb eines Strings der mit " begrenzt wird, darf das Zeichen " nicht vorkommen da sonst das Programm denkt es hätte das ende des Strings erreicht. Um dennoch das Zeichen " anzeigen bzw ausgeben zu lassen, muss man \" für jedes " schreiben.

    Der Vollständigkeit halber: in einigen deiner Methoden existieren Flüchtigkeitsfehler, in diesem falle sind ein paar Variablen falsch geschrieben. :)
    Außerdem verwendest du einfach mal in log-in.php als Tabelle "members" während in reg-ister.php überall die Tabelle "benutzer" verwendet wird. xD

    In log-in.php:
    usernamecheck ($username, $password, $name, $email);
    zu
    usernamecheck ($username, $password);
    abändern.

    Desweiteren musst du nicht bei jeder Methode
    include_once 'sql.php';
    verwenden, einmal am Anfang der Datei reicht vollkommen.
    Desweiteren benötigt mysqli_query als erstes argument die verbindung zur datenbank, spricht das ergebnis von mysqli_connect. Deshalb müssen alle Variablen von $db auf $connect abgeändert werden.
    Außerdem ist $connect global und kann deshalb nicht ohne weiteres innerhalb einer Methode genutzt werden. Mit
    global $connect;
    ist auch dieses Problem behoben.

    Nun zu den SQL INSERT befehlen:
    Richtigerweise müsste es für die Registrierung lauten:
    $insertsql = "INSERT INTO benutzer (name, username, password, email, allow_login) VALUES ('$name', '$username', '$hash', '$email', 'yes')";

    Mittels " und ' in einem SQL Befehl werden Daten des Types String (bzw VARCHAR, TEXT etc) angegeben. Um aber Tabellen namen und Spalten anzusprechen reicht der Name der Tabelle bzw Spalte.
    (Oder du musst das Zeichen
    `
    benutzen für Spalten und Tabellen Namen.)

    Ein weiterer gravierender Fehler ist, das du in einigen Methoden einfach so mal die Verbindung kappst, obwohl du sie danach noch verwendest. xD Mein tipp hier: kapp einfach nicht die Verbindung, das macht PHP von selbst.

    log-in.php:
    mysqli_query gibt ein Object, besser gesagt ein resultset, zurück.
    Eine einfache Methode um an die Daten innerhalb des Objektes heran zu kommen ist es in ein Array umzuwandeln.
    Beispiel anhand von logincheck:
    $loginstatusk = mysqli_query($connect, $loginstatus);
    $loginstatusk = mysqli_fetch_array($loginstatusk);
    if ($loginstatusk[0] == 'yes') {
    	//dein code
    }

    mysqli_fetch_array wandelt das Objekt in ein Array um.
    Dabei ist 0 die erste spalte des Ergebnis, 1 die zweite etc.
    Das Ergebnis enthält aber nur soviel spalten wie du angefordert hast, im falle von logincheck also eine. Deshalb liegt die Spalte allow_login auch auf der 0.

    Und was password_verify weiß ich nun auch... ich hab das bei meinem Eigenem System alles selbstgeschrieben obwohl es so ne Funktion in PHP schon gibt... xD

    Beachte ebenfalls das password_hash mit PASSWORD_BCRYPT IMMER einen 60 Zeichen langen String generiert, gib dem Feld password in der Tabelle benutzer dementsprechend platz.

    Mfg
    ITgenie98
  17. Autor dieses Themas

    h***********r

    Vielen dank für deine Hilfe :)

    Ich habe die Dateien abgeändert (hoffe ich habe nichts übersehen), dennoch habe ich einige Probleme damit. Wenn ich jetzt z.Bsp auf der Log-in Seite keine, einen, zwei Werte mit und oder ohne Sonderzeichen einfüge und dann bestätige kommt sofort die Nachricht "Ein Fehler ist aufgetreten". Theoretisch dürfte er aber nicht einmal bis zu den MySQLi Abfragen kommen, wo dieser Fehler ausgegeben werden könnte, da noch vorher erkannt wird, dass z.Bsp kein Wert eingetragen ist oder dass dieser Sonderzeichen enthält.

    log-in.php

    <?php
    session_start();
    include 'sql.php';
    global $connect;
    	//Setzen der Variablen
    	if (isset($_POST['submit'])) {
    		$username = $_POST['username'];
    		$password = $_POST['password'];
    		checkset($username, $password);
    	}
    	//Überprüfen ob Variable gesetzt ist
    	function checkset($username, $password){
    		$notsetcount = 0;
    		if (!isset($username)){$notsetcount = $notsetcount + 1;}
    		if (!isset($password)){$notsetcount = $notsetcount + 1;}
    		if ($notsetcount === 0){ checkinput($username, $password);}
    		else {die("<div id='loginmsg'>Bitte kontrolliere deine Eingabe.</div>");}
    	}
    	//Entfernen von Sonderzeichen
    	function checkinput($username, $password){
    		$bad = array('*','"',"'",'#',',','?','!','>','<','=',']','[','(',')','{','}');
    		$good = 42;
    		$badl = 0;
    		$usernamerlc = str_replace($bad, $good, $username);
    		$passwordrlc = str_replace($bad, $good, $password);
    		if ($username !== $usernamerlc){$badl = $badl + 1;}
    		if ($password !== $passwordrlc){$badl = $badl + 1;}
    		if ($badl === 0){ usernamecheck ($username, $password);}
    		else {die("<div id='loginmsg'>Die Eingabe darf folgende Zeichen nicht beinhalten: ('*','\"','\'','#',',','?','!','>','<','=',']','[','(',')','{','}')</div>");}
    	}
    	//Überprüfen ob Benutzername vergeben ist
    	function usernamecheck ($username, $password){
    		include_once 'sql.php';
    		$grabusername = "SELECT * FROM member WHERE username='$username'";
    		$grabusernamek = mysqli_query($connect, $grabusername) or die("<div class='loginmsg'>Ein Fehler ist aufgetreten<div>");
    		if (mysqli_num_rows($grabusernamek) == 1) {
    			passwordhash($username, $password);
    		}
    		else{
    			die("<div id='loginmsg'>Benutzername oder Passwort falsch</div>");
    		}
    	}
    	//Umwandeln des Passworts in einen Hashwert u abgleichen
    	function passwordhash ($username, $password){
    		//Hohlen des Hashs
    		$hash = "SELECT password FROM member WHERE username='$username'";
    		$hashk= mysqli_query($connect, $hash);
    		//Vergleichen
    		if (password_verify($password, $hashk)) {
    			logincheck($username, $password);
    		}
    		else {
    			die("<div id='loginmsg'>Benutzername oder Passwort falsch</div>");
    		}
    	}
    	//Überprüfen ob sich der Benutzer anmelden darf
    	function logincheck ($username, $password){
    		$loginstatus = "SELECT allow_login FROM member WHERE username='$username'";
    		$loginstatusk = mysqli_query($connect, $loginstatus);
    		$loginstatusk = mysqli_fetch_array($loginstatusk);
    		if ($loginstatusk[0] == 'yes') {
    			$_SESSION['username'] = $username;
    			header('location: member.php');
    		}
    		else{
    			die("<div id='loginmsg'>Du darfst dich hier nicht anmelden.</div>");
    		}
    	}
    ?>


    reg-ister.php

    <?php
    session_start();
    include 'sql.php';
    global $connect;
    	//Setzen der Variablen
    	if (isset($_POST['submit'])) {
    		$username = $_POST['username'];
    		$password = $_POST['password'];
    		$name = $_POST['name'];
    		$email = $_POST['email'];
    		checkset($username, $password, $name, $email);
    	}
    	//Überprüfen ob Variable gesetzt ist
    	function checkset($username, $password, $name, $email){
    		$notsetcount = 0; //Bei Fehlern soll dieser Wert erhöht werden.
    		if (!isset($username)){$notsetcount = $notsetcount + 1;}
    		if (!isset($name)){$notsetcount = $notsetcount + 1;}
    		if (!isset($password)){$notsetcount = $notsetcount + 1;}
    		if (!isset($email)){$notsetcount = $notsetcount + 1;}
    		//Überprüfen des Werts von $notsetcount 
    		if ($notsetcount === 0){ checkinput($username, $password, $name, $email);}
    		else {die("<div id='loginmsg'>Bitte kontrolliere deine Eingabe.</div>");}
    	}
    	//Entfernen von Sonderzeichen
    	function checkinput($username, $password, $name, $email){
    		$bad = array('*','"',"'",'#',',','?','!','>','<','=',']','[','(',')','{','}');
    		$good = 42;
    		$badl = 0;
    		$usernamerlc = str_replace($bad, $good, $username);
    		$passwordrlc = str_replace($bad, $good, $password);
    		$namerlc = str_replace($bad, $good, $name);
    		$emailrlc = str_replace($bad, $good, $email);
    		if ($username !== $usernamerlc){$badl = $badl + 1;}
    		if ($name !== $unamerlc){$badw = $badw + 1;}
    		if ($password !== $passwordrlc){$badl = $badl + 1;}
    		if ($email !== $emailrlc){$badl = $badl + 1;}
    		if ($badl === 0){ checkmail ($username, $password, $name, $email);}
    		else {die("<div id='loginmsg'>Die Eingabe darf folgende Zeichen nicht beinhalten: ('*','\"','\'','#',',','?','!','>','<','=',']','[','(',')','{','}')</div>");}
    	}
    	//Überprüfen ob bei Email eine gültige Email-Adresse ist.
    	function checkmail ($username, $password, $name, $email){
    		if (filter_var($email, FILTER_VALIDATE_EMAIL)) {checkdb ($username, $password, $name, $email);}
    		else {die("<div id='loginmsg'>Die Email-Adresse ist ungültig.</div>");}
    	}
    	//Überprüfen ob der Benutzername und oder die Email bereits benutzt wurden.
    	function checkdb ($username, $password, $name, $email){
    		include_once 'sql.php';
    		$dbcounter = 0;
    		//Benutzernamen überprüfen
    		$checkusername = "SELECT * FROM member WHERE username='$username'";
    		$checkusernamek = mysqli_query($connect, $checkusername) or die("<div class='loginmsg'>Ein Fehler ist aufgetreten<div>");
    		if (mysqli_num_rows($checkusernamek) == 1){$dbcounter = $dbcounter + 1;}
    		else {$dbcounter = $dbcounter + 0;}
    		//Email überprüfen
    		$checkmail = "SELECT * FROM member WHERE username='$username'";
    		$checkmailk = mysqli_query($connect, $checkusername) or die("<div class='loginmsg'>Ein Fehler ist aufgetreten<div>");
    		if (mysqli_num_rows($checkmailk) == 1){$dbcounter = $dbcounter + 1;}
    		else {$dbcounter = $dbcounter + 0;}
    		mysqli_close($connect);
    		//$dbcounter überprüfen
    		if ($dbcounter === 0){ register($username, $password, $name, $email);}
    		else {die("<div id='loginmsg'>Benutzername oder Email bereits registriert.</div>");}
    	}
    	//Generieren des Hashwerts + Einfügen der Daten
    	function register($username, $password, $name, $email){
    		//Erzeugen des Hashwerts
    		$hash = password_hash($password, PASSWORD_BCRYPT);
    		//Einfügen in Datenbank
    		$insertsql = "INSERT INTO member (name, username, password, email, allow_login) VALUES ('$name', '$username', '$hash', '$email', 'yes')";
    		$insertsqlk = mysqli_query($connect, $insertsql)or die("<div class='loginmsg'>Ein Fehler ist aufgetreten<div>");
    		echo "<div id='loginmsg'>Registrierung erfolgreich!</div>";
    	}
    ?>


  18. Du nutzt
    global $connect;
    völlig an der falschen Stelle.

    Also es gibt einen sogennanten Kontex. Ein Kontex beim Programmieren ist ein Code Block wie z.b. eine datei, oder eine Methode / Funktion. Innerhalb eines Contex kann jeder auf die enthaltenen Variabeln zugreifen. Es kann aber normal kein Untergeordneter Kontex mit dem Übergeordneten Kontex kommunizieren.

    Eine Veranschaulichung:

    Deine Datei ist ein großer Karton in das du alles hineinpackst.
    Zuerst packst du dort deine $connect Variable rein, diese liegt nun als Zettel in diesem Karton.
    Nun erstellen wir eine neue function, diese ist ein kleiner Karton innerhalb des Großen Kartons.
    Nun rufst du innerhalb deiner function eine Mehode auf die etwas machen soll. Ein Arbeiter in deinem funktions Karton geht los und sucht sich alles zusammen, doch er weiß garnicht das sein Karton teil eines größeren Kartons ist wo auch noch Daten rumliegen, und er weiß auch nur von den Daten die in seinem Karton liegen. Wir müssen also jedem Arbeiter in unserem Funktions-Karton mitteilen das Daten auch eine ebene höher liegen. Deshalb muss in jeder function in der du die $connect Variable nutze willst vorher ein
    global $connect;
    stehen.
    Globale Variabeln sind halt variabeln die über die gesamte datei gelten, wie z.b. $connect.

    Ein code beispiel:
    function usernamecheck ($username, $password){
    		global $connect;	//macht allen funktionen innerhalb der {} klar das $connect exisitert und sie diese global suchen müssen
    		$grabusername = "SELECT * FROM member WHERE username='$username'";
    		$grabusernamek = mysqli_query($connect, $grabusername) or die("<div class='loginmsg'>Ein Fehler ist aufgetreten<div>");
    		if (mysqli_num_rows($grabusernamek) == 1) {
    			passwordhash($username, $password);
    		}
    		else{
    			die("<div id='loginmsg'>Benutzername oder Passwort falsch</div>");
    		}
    	}


    Mfg
    ITgenie98
  19. Autor dieses Themas

    h***********r

    Ok, super. Daran scheint es gelegen zu haben. :D

    Jetzt gibt es nur noch ein kleines Problem. Bei dem Registrieren wird ja ein Hashwert erstellt. Dieser wird ja beim Login benutzt um zu kucken ob das Passwort richtig ist. Leider Funktioniert das ganze nicht so wirklich, der Login schlägt fehl, selbst wenn das Passwort richtig ist. Evtl liegt es daran, dass password_hash für z.Bsp A immer verschiedene Hashs ausgibt. Da bekommt man z.Bsp
    $2y$10$tHrM8Ol4yhZBBKHDvF7fWuomvhbbKhmSE/z9F1nrjfsIHSq18phGW

    aber auch
    $2y$10$jW3SxIwFeBSIyf7KG4eeeOMPCYlxdSw0gXgFa.qouzUdXMVmJ7DDi

    als Ausgabe für den Hash für 'A'
    (Zum Testen)
    phptester.net
    <?php
    $hash = password_hash('A', PASSWORD_BCRYPT);
    echo $hash;
    ?>



    So sieht es jetzt gerade aus:

    log-in.php

    <?php
    session_start();
    include 'sql.php';
    global $connect;
    	//Setzen der Variablen
    	if (isset($_POST['submit'])) {
    		$username = $_POST['username'];
    		$password = $_POST['password'];
    		checkset($username, $password);
    	}
    	//Überprüfen ob Variable gesetzt ist
    	function checkset($username, $password){
    		$notsetcount = 0;
    		if (!isset($username)){$notsetcount = $notsetcount + 1;}
    		if (!isset($password)){$notsetcount = $notsetcount + 1;}
    		if ($notsetcount === 0){ checkinput($username, $password);}
    		else {die("<div id='loginmsg'>Bitte kontrolliere deine Eingabe.</div>");}
    	}
    	//Entfernen von Sonderzeichen
    	function checkinput($username, $password){
    		$bad = array('*','"',"'",'#',',','?','!','>','<','=',']','[','(',')','{','}');
    		$good = 42;
    		$badl = 0;
    		$usernamerlc = str_replace($bad, $good, $username);
    		$passwordrlc = str_replace($bad, $good, $password);
    		if ($username !== $usernamerlc){$badl = $badl + 1;}
    		if ($password !== $passwordrlc){$badl = $badl + 1;}
    		if ($badl === 0){ usernamecheck ($username, $password);}
    		else {die("<div id='loginmsg'>Die Eingabe darf folgende Zeichen nicht beinhalten: ('*','\"','\'','#',',','?','!','>','<','=',']','[','(',')','{','}')</div>");}
    	}
    	//Überprüfen ob Benutzername vergeben ist
    	function usernamecheck ($username, $password){
    		global $connect;
    		$grabusername = "SELECT * FROM member WHERE username='$username'";
    		$grabusernamek = mysqli_query($connect, $grabusername) or die("<div class='loginmsg'>Ein Fehler ist aufgetreten<div>");
    		if (mysqli_num_rows($grabusernamek) == 1) {
    			passwordhash($username, $password);
    		}
    		else{
    			die("<div id='loginmsg'>Benutzername oder Passwort falsch</div>");
    		}
    	}
    	//Umwandeln des Passworts in einen Hashwert u abgleichen
    	function passwordhash ($username, $password){
    		global $connect;
    		//Hohlen des Hashs
    		$hash = "SELECT password FROM member WHERE username='$username'";
    		$hashk= mysqli_query($connect, $hash) or die("<div class='loginmsg'>Ein Fehler ist aufgetreten<div>");
    		//Vergleichen
    		if (password_verify($password, $hashk)) {
    			logincheck($username, $password);
    		}
    		else {
    			die("<div id='loginmsg'>Benutzername oder Passwort falsch</div>");
    		}
    	}
    	//Überprüfen ob sich der Benutzer anmelden darf
    	function logincheck ($username, $password){
    		global $connect;
    		$loginstatus = "SELECT allow_login FROM member WHERE username='$username'";
    		$loginstatusk = mysqli_query($connect, $loginstatus);
    		$loginstatusk = mysqli_fetch_array($loginstatusk);
    		if ($loginstatusk[0] == 'yes') {
    			$_SESSION['username'] = $username;
    			header('location: member.php');
    		}
    		else{
    			die("<div id='loginmsg'>Du darfst dich hier nicht anmelden.</div>");
    		}
    	}
    ?>



    reg-ister.php

    <?php
    session_start();
    include 'sql.php';
    	//Setzen der Variablen
    	if (isset($_POST['submit'])) {
    		$username = $_POST['username'];
    		$password = $_POST['password'];
    		$name = $_POST['name'];
    		$email = $_POST['email'];
    		checkset($username, $password, $name, $email);
    	}
    	//Überprüfen ob Variable gesetzt ist
    	function checkset($username, $password, $name, $email){
    		$notsetcount = 0; //Bei Fehlern soll dieser Wert erhöht werden.
    		if (!isset($username)){$notsetcount = $notsetcount + 1;}
    		if (!isset($name)){$notsetcount = $notsetcount + 1;}
    		if (!isset($password)){$notsetcount = $notsetcount + 1;}
    		if (!isset($email)){$notsetcount = $notsetcount + 1;}
    		//Überprüfen des Werts von $notsetcount 
    		if ($notsetcount === 0){ checkinput($username, $password, $name, $email);}
    		else {die("<div id='loginmsg'>Bitte kontrolliere deine Eingabe.</div>");}
    	}
    	//Entfernen von Sonderzeichen
    	function checkinput($username, $password, $name, $email){
    		$bad = array('*','"',"'",'#',',','?','!','>','<','=',']','[','(',')','{','}');
    		$good = 42;
    		$badl = 0;
    		$usernamerlc = str_replace($bad, $good, $username);
    		$passwordrlc = str_replace($bad, $good, $password);
    		$namerlc = str_replace($bad, $good, $name);
    		$emailrlc = str_replace($bad, $good, $email);
    		if ($username !== $usernamerlc){$badl = $badl + 1;}
    		if ($name !== $unamerlc){$badw = $badw + 1;}
    		if ($password !== $passwordrlc){$badl = $badl + 1;}
    		if ($email !== $emailrlc){$badl = $badl + 1;}
    		if ($badl === 0){ checkmail ($username, $password, $name, $email);}
    		else {die("<div id='loginmsg'>Die Eingabe darf folgende Zeichen nicht beinhalten: ('*','\"','\'','#',',','?','!','>','<','=',']','[','(',')','{','}')</div>");}
    	}
    	//Überprüfen ob bei Email eine gültige Email-Adresse ist.
    	function checkmail ($username, $password, $name, $email){
    		if (filter_var($email, FILTER_VALIDATE_EMAIL)) {checkdb ($username, $password, $name, $email);}
    		else {die("<div id='loginmsg'>Die Email-Adresse ist ungültig.</div>");}
    	}
    	//Überprüfen ob der Benutzername und oder die Email bereits benutzt wurden.
    	function checkdb ($username, $password, $name, $email){
    		global $connect;
    		$dbcounter = 0;
    		//Benutzernamen überprüfen
    		$checkusername = "SELECT * FROM member WHERE username='$username'";
    		$checkusernamek = mysqli_query($connect, $checkusername) or die("<div class='loginmsg'>Ein Fehler ist aufgetreten<div>");
    		if (mysqli_num_rows($checkusernamek) == 1){$dbcounter = $dbcounter + 1;}
    		else {$dbcounter = $dbcounter + 0;}
    		//Email überprüfen
    		$checkmail = "SELECT * FROM member WHERE email='$email'";
    		$checkmailk = mysqli_query($connect, $checkusername) or die("<div class='loginmsg'>Ein Fehler ist aufgetreten<div>");
    		if (mysqli_num_rows($checkmailk) == 1){$dbcounter = $dbcounter + 1;}
    		else {$dbcounter = $dbcounter + 0;}
    		//$dbcounter überprüfen
    		if ($dbcounter === 0){ register($username, $password, $name, $email);}
    		else {die("<div id='loginmsg'>Benutzername oder Email bereits registriert.</div>");}
    	}
    	//Generieren des Hashwerts + Einfügen der Daten
    	function register($username, $password, $name, $email){
    		global $connect;
    		//Erzeugen des Hashwerts
    		$hash = password_hash($password, PASSWORD_BCRYPT);
    		//Einfügen in Datenbank
    		$insertsql = "INSERT INTO member (name, username, password, email, allow_login) VALUES ('$name', '$username', '$hash', '$email', 'yes')";
    		$insertsqlk = mysqli_query($connect, $insertsql)or die("<div class='loginmsg'>Ein Fehler ist aufgetreten<div>");
    		echo "<div id='loginmsg'>Registrierung erfolgreich!</div>";
    	}
    ?>


    Beitrag zuletzt geändert: 28.6.2017 18:08:10 von horstexplorer
  20. Erinnerst du dich an meinen post wo ich dich auf logincheck hingewiesen habe und das die Daten dort vorher umgewandelt werden müssen? Dasselbe mus bei passwordhash passieren, nur diesmal mit $hashk anstatt $loginstatusk. Und nicht vergessen $hashk[0] nutzen um an die Spalte zu kommen.
    :)

    Edit: Warum immer andere hashes entstehen: Der Generierte hash enthält auch informationen zum Algorithmus zum Aufwand und zum verwendeten Salt (wird als Schlüssel verwendet um das cracken zu erschwären).
    password_verify erkennt diese informationen des Hashes und kann somit unter gleichen bedinungen die eingabe erneut hashen und vergleichen.
    http://php.net/manual/de/function.password-verify.php


    Mfg
    ITgenie98

    Beitrag zuletzt geändert: 28.6.2017 18:23:01 von itgenie98
  21. Autor dieses Themas

    h***********r

    Dankeschön, das funktioniert so super :)
    $hashk= mysqli_query($connect, $hash) or die("<div class='loginmsg'>Ein Fehler ist aufgetreten<div>");
    		$hashk = mysqli_fetch_array($hashk);
    		//Vergleichen
    		if (password_verify($password, $hashk[0])) {
    			logincheck($username, $password);
    		}


    Ich hatte gerade noch die Idee, einen 6 stelligen Code mitzugeben um das Passwort später zurücksetzen zu können.
    Meine Umsetzung sieht so aus, allerdings funktioniert das auch wieder nicht so wie man sich denkt. Muss sicher wieder was banales sein, was ich übersehen habe.

    //$dbcounter überprüfen
    		if ($dbcounter === 0){ resetgen($username, $password, $name, $email);}
    		else {die("<div id='loginmsg'>Benutzername oder Email bereits registriert.</div>");}
    	}
    	//Generieren des Reset Codes
    	function resetgen ($username, $password, $name, $email){
    	$resetcode = mt_rand(100000,999999);  
    	register($username, $password, $name, $email, $resetcode);
    	}
    	
    	//Generieren des Hashwerts + Einfügen der Daten
    	function register($username, $password, $name, $email, $resetcode){
    		global $connect;
    		//Erzeugen des Hashwerts
    		$hash = password_hash($password, PASSWORD_BCRYPT);
    		//Einfügen in Datenbank
    		$insertsql = "INSERT INTO member (name, username, password, email, reset_code, allow_login,) VALUES ('$name', '$username', '$hash', '$email', '$resetcode', 'yes')";
    		$insertsqlk = mysqli_query($connect, $insertsql)or die("<div class='loginmsg'>Ein Fehler ist aufgetreten<div>");
    		echo "<div id='registermsg'><p>Registrierung erfolgreich!</p>";
    		echo "<p>Code zum zurücksetzen des Passworts:</p>";
    		echo "'$resetcode'</p>";
    		echo "<p>Bewahre ihn sicher auf, da du ohne ihn kein neues Passwort bekommst!</p></div>";
    	}
  22. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!