kostenloser Webspace werbefrei: lima-city


Registrierungsseite mit PhP & MySQL

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

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

    Hallöchen alle :),
    ich würde wieder einmal gerne etwas basteln mit PhP und MySQL. Ich habe hier einen Login für meine Website. Dieser funktioniert im Grund schon recht gut, dennoch würde ich ihn gerne etwas aufpeppen. Damit ihr wisst worum es geht, gibt es hier erstmal den Code von dem was ich habe vorneweg :) Alle Dateien liegen auf dem Webserver im selben Verzeichnis.

    login.php

    div style="background-color:rgba(100, 100, 100, 0.5) ">
    <center>
    	<form action="#" method="post">
    	<div class="loginbox">
    	<div id="h1">Login</div>
    		<?php include 'log-in.php';	?>
    		<input type="text" name="username" placeholder="Username"></input><br>	
    		<input type="password" name="password" placeholder="Password"></input><br>		
    		<input type="submit" value="LOGIN" name="submit" id="button"></input>
    	</div>
    	</form>
    </center>
    </div>


    log-in.php
    <?php
    session_start();
    include 'sql.php';
    	if (isset($_POST['submit'])) {
    		$username = $_POST['username'];
    		$password = $_POST['password'];
    		chckusername($username, $password);
    	}
    
    	function chckusername($username, $password){
    		include_once 'sql.php';
    		$check = "SELECT * FROM login WHERE username='$username'";
    		$check_q = mysql_query($check) or die("<div class='loginmsg'>Error on checking Username<div>");
    
    		if (mysql_num_rows($check_q) == 1) {
    			chcklogin($username, $password);
    		}
    		else{
    			echo "<div id='loginmsg'>Wrong Email</div>";
    		}
    	}
    
    	function chcklogin($username, $password){
    		$login = "SELECT * FROM login WHERE username='$username'  and password='$password'";
    		$login_q = mysql_query($login) or die('Error on checking Username and Password');
    
    		// Mysql_num_row is counting table row
    		if (mysql_num_rows($login_q) == 1){
    			echo "<div id='loginmsg'> Logged in as $username </div>"; 
    			$_SESSION['username'] = $username;
    			header('Location: member.php');
    		}
    		else {
    			echo "<div id='loginmsg'>Wrong Password </div>"; 
    			//header('Location: login-problem.php');
    		}
    	}
    ?>



    sql.php

    <?php
    
    	$host = 'localhost';
    	$user = 'Benutzername';
    	$db = 'Datenbank';
    	$pass = '1234';
    
    $connect = @mysql_connect($host, $user, $pass) or die('Database could not connect');
    $select = @mysql_select_db($db, $connect) or die('Database could not select');
    ?>



    Der Login wird auf der gewünschten Seite (member.php) mit dem Code "überprüft"

    <?php
    	session_start();
    	if (isset($_SESSION['username'])) {
    		echo "<div class='loginbox'>Member: ".$_SESSION['username']."</div>";
    	}
    	else {
    		header('location: index.php');
    	}
    	?>



    Soweit so gut. Wie ich bereits erwähnte würde ich das ganze nun etwas aufpeppen wollen.


    Dazu würde ich weitere Seite für die Registrierung anlegen. Da soll dann ein Name(name) Benutzername(username) Passwort(password) Email(email) eingegeben werden können.

    Das ganze soll dann in MySQL in eine Tabelle eingetragen werden und noch mit einer ID ausgestattet werden (es sollte ja eine automatisch per A_I hinzugefügt werden, wenn es nicht von Hand gesetzt wird; ggf muss man da nichts weiteres machen), wo ich es dann ja mit der Login Seite das Passwort und den Benutzernamen raushohle. Sollte der Name bereits vergeben sein, könnte man ggf eine Fehlermeldung anzeigen.
    Zudem soll sich dort in der Tabelle noch ein Wert Allow_Login(allow_login) befinden, der bei dem erstellen des Eintrages normal auf 'yes' steht. Dieser soll dann beim Login überprüft werden ob er 'yes' ist, wenn nicht soll ein Fehler, z.bsp Login gescheitert ausgegeben werden.

    Da ich mich leider nicht sonderlich gut auskenne, wäre es super, wenn ihr mir bei der 'Erneuerung' und Erweiterung des Codes helfen würdet ;)

    Die form für die Registerseite habe ich möglicherweise bereits fertig.
    <form action="#" method="post">
    	<div class="registerbox">
    	<div id="h1">Register</div>
    		<?php include 'reg-ister.php';	?>
                    <input type="text" name="name" placeholder="Name"></input><br>
    		<input type="text" name="username" placeholder="Benutzername"></input><br>	
    		<input type="password" name="password" placeholder="Password"></input><br>	
                    <input type="text" name="email" placeholder="Email"></input><br>		
    		<input type="submit" value="Registrieren" name="submit" id="button"></input>
    	</div>
    	</form>


    Vielen Dank schon einmal für eure Hilfe :)


    Beitrag zuletzt geändert: 22.6.2017 15:32:19 von horstexplorer
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

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

  3. michaelkoepke

    michaelkoepke hat kostenlosen Webspace.

    Hallo horstexplorer,

    ich finde es immer toll wenn sich jemand für das Programmieren interessiert.
    Ich weiß nicht wo du dir das Login abgeschaut hast, jedoch ist es alles andere als gut geschrieben.
    Es ist nicht gut, sogar fahrlässig ein Passwort im Klartext in eine Datenbank zu schreiben!
    Ebenfalls kann die Abfrage durch ein SQL-Inject sehr leicht umgangen werden!

    Was meine ich damit?

    Du übergibst die eingegebenen Userdaten an die chckusername() Funktion und schreibst den $username direkt in die SQL Anweisung.
    Die Eingabe des Users könnten lauten „‘ OR 1 = 1;“ und die erste Abfrage wäre mit true beendet.
    Als nächstes überprüfst du das Passwort, was irgendwie keinen Sinn macht (hätte oben schon mit passieren können). Warum? Man gibt dem User kein Feedback im Sinne von Achtung dein Username ist falsch oder Achtung dein Passwort ist falsch. Spätestens hier weiß ein unerwünschter Gast ob zumindest der Username existiert. Aber ich schweife ab … Zurück zur chcklogin() Funktion. Hier das Selbe Szenario wie oben. Die Eingabe „‘ OR 1 = 1;“ gibt true zurück und ich bin eingeloggt.
    Des Weiteren sollte die mysql_*() Funktion nicht mehr genutzt werden sondern die mysqli_*() Funktion.

    Wie ist das zu lösen?

    Benutze die password_hash() und password_verify() Funktionen um das Passwort zu verschlüsseln und zu prüfen.
    Prüfe die Eingabe des Benutzers mit der mysqli_real_escape_string() Funktion. Diese entfernt maskiert Sonderzeichen sodass man den oben genannten String nicht mehr eingeben kann.
    Besser wäre es, wenn du die Eingabe mit einem Regulären Ausdruck prüfst, quasi nur Zeichen zulässt, welche du erlaubst. (Beim Passwort schwierig, aber machbar)

    Zu deiner eigentlichen Frage.

    Schau bei Google :spammer: Es gibt viele Tutorials. Schaue dir nicht nur eins an, sondern mehrere.

    Ansonsten hier eine kleine Anregung.

    1. Prüfe die übergebenen Werte des Users auf Gültigkeit (Reguläre Ausdrücke zum Beispiel)
    2. Maskiere eingegebene Sonderzeichen
    3. Speichere die Werte (Passwort natürlich verschlüsselt) in einer Datenbank.
    Bsp.:
    INSERT INTO `TableName` (`name`, `user`, `pass`, `email`, `allow_login`) VALUES ($name, $user, $pass, $email, 1);

    Die ID wird in MySQL automatisch vergeben (Wenn der Wert natürlich als Primary Key und auto_increment gesetzt ist)
    Bsp:
    CREATE TABLE `TableName` (
    `ID`          int(11)     NOT NULL PRIMARY KEY AUTO_INCREMENT,
    […]
    )

    4. Erfolgsmeldung zurückgeben bzw. Fehlermeldung

    Ich hoffe ich konnte dir helfen und Anregungen zum Absichern deiner geschrieben Skripte geben.
    Wenn du magst kann ich dir auch gern beim Erstellen deines Skriptes behilflich sein, schreibe dazu einfach eine PN an mich.

    Viele Grüße Micha

    Beitrag zuletzt geändert: 22.6.2017 15:56:16 von michaelkoepke
  4. Bevor Du irgend etwas anderes machst, lösche deinen kompletten login code und befasse dich mit den folgenden Themen:

    * SQL Injections
    * Cross Site Scripting
    * Password Hashing
    * MySQLi oder PDO
    * User Input Sanitization
    * User Login Best Practices


    In seiner aktuellen Form ist deine Login solution anfällig für so ziemlich sämtliche attacken die ich mir erdenken kann. User Inputs werden nicht gecheckt, Passwörter sind offensichtlich im Klartext gespeichert und viele viele andere absolut kritische Probleme sind in deinem Script zu finden.

    Um es mit anderen Worten zu sagen, du bettelst leute wie mich gerade dazu deine Seite komplett auseinander zu nehmen und dir das Leben zu hölle zu machen.
  5. da kann ich strange nur zustimmen,
    soooo wie oben in Deinem Code solltest Du das Script nie laufen lassen und am besten löschen.

    Tip: suche Anleitungen / Tutorials wie z.B. sowas: wikihow ... sicheres-Login-Skript

    aber auch so "Tutorials" sind oft keine Komplett-Lösungen,
    weil die auch nie alles beachten, deshalb immer besser selber
    noch auf "Sicherheit" achten und "Löcher" stopfen ... oO

  6. Autor dieses Themas

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

    Ok, vielen dank für die Tipps. Ich habe evtl noch nicht alles umgesetzt was ihr vorgeschlagen habt, ich bin aber noch dabei. sql.php und login.php würde ich behalten, es sei denn da geht auch etwas nicht so mit rechten dingen zu.

    Bis jetzt sieht der Code so aus:

    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 = "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 = "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 = "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>";
    		}
    	}
    ?>



    Und hier den Teil zum registrieren:

    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($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($username, $password, $name, $email){
    		$hash = "password_hash($password, PASSWORD_BCRYPT) "
    		
    		INSERT INTO 'benutzer' ('name', 'username', 'password', 'email', 'allow_login') VALUES ($name, $username, $hash, $email, 1);
    		echo "<div id='loginmsg'>Registrierung erfolgreich!</div>";
    	}
    ?>


    Bei dem Insert Into bin ich mir nicht ganz sicher, ob ich das richtig benutze (evtl wäre hier ein insert if not exist oder so besser).
    Seht ihr da Fehler oder sollte ich sonnst noch etwas ändern?


    Beitrag zuletzt geändert: 22.6.2017 19:04:40 von horstexplorer
  7. Ein Login System steht und fällt mit den Methoden mit denen ein solches System erstellt werden. Und in deinem Fall würde ich dir ersteinmal raten dich mit der Verarbeitung von Formularen zu beschäftigen und Logik-Strukturen. Denn in diesem Bereich fehlt dir offensichtlich noch die Basiskenntnis um auch nur darüber nach zu denken ein Login-System auf deiner Webseite zu packen.

    https://www.w3schools.com/php/ ist ein guter Einstiegspunkt. Auch wenn dies Langweilig scheinen mag, arbeite dich durch alle Kapitel/Themen durch, am Ende wirst du ein besseres Verständnis für die Sprache haben und ein solides Fundament auf dem du aufbauen kannst.

    Danach kannst du dich mit den Themen auseinandersetzen die ich in meinem vorigen Beitrag aufgelistet habe und dich dann erneut an ein Login System wagen. Und dank des guten Fundaments, kann man dich dann auch viel besser unterstützen.


    EDIT: In anderen Worten, es macht keinen Sinn dir ein Login-System, Zeile für Zeile vor zu kauen, wenn du am Ende nicht verstehst was überhaupt vorgeht.

    Beitrag zuletzt geändert: 22.6.2017 19:29:43 von strange
  8. Autor dieses Themas

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

    Habe schon einmal angefangen das mir anzusehen damit es nicht ewig dauert. Denke das ich damit morgen Abend fertig sein werde mit dem wichtigsten. Ich melde mich dann noch einmal hier.
  9. 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!