PHP Loginscript

S

se7Ro

Gast
hallo zusammen,

ich hätte ein kleines Anliegen. Wir haben in der Schule derzeit als Internetprogrammierungsfach PHP und ich würde gerne nebenbei auch zu Hause mein Wissen erweiter, weshalb ich versuche, ein kleines Schulprojekt auf die Beine zu stellen, womit ich vor kurzem angefangen habe. Momentan hab ich die Registrierung fertig und sie funktioniert auch (mit "einfacher" Passwortverschlüsselung etc.)

Hier der Code, sollten Fragen aufkommen: (es gibt noch ein Formular zum Ausfüllen, ist aber eher unwichtig denke ich)
Code:
<?php

function registrieren($username, $password, $password2, $email)
{	
	include_once ('config.php');
	
	//Verbindung zur MySQL Datenbank
	$db = mysqli_connect(DB_host, DB_user, DB_password, DB_base) or die ("Keine Verbindung möglich");
	//Überprüfungen (PW1 gleich PW2, E-Mail)
	if ($password != $password2)
		{
			return false;
		}
	if (!filter_var($email, FILTER_VALIDATE_EMAIL))
		{
			return false;
		}
		
		
	$query = "SELECT ID FROM users WHERE email = '$email';";
	$result = mysqli_query($db, $query);
	if($result->num_rows > 0) { return false; }
	
	
	//
	$username = mysqli_real_escape_string($db, $username);
	$password = mysqli_real_escape_string($db, $password);
	$email = mysqli_real_escape_string($db, $email);
	
	//Passwort verschlüsseln
	$hash = hash('sha256', $password);	
	
	$timestamp = time();	
	$query = "INSERT INTO users(username, password, email, timestamp)
			  VALUES
			  ('$username','$hash','$email','$timestamp');";
	mysqli_query($db,$query);
	
	return true;
}



?>

Jetzt versuche ich mich an die Loginpage seit Tagen, die nach erfolgreichem Überprüfen der eingegeben Daten (E-Mail und Passwort) zu einem Userbereich weiterleiten soll.. ich hab gegoogled, es mit der Methode wie beim Registrieren getestet aber ich schaff es nicht, da ich ja auch Sessions oder Cookies brauche (beides zusammen, oder alleine?) und nicht weiß, wie ich das anstellen soll. Hab mir auch n Ablauf erstellt, was das Script anstellen soll, wie es vorgeht etc. und ständig die Dateien wieder verworfen, weshalb ich nun mal nach Hilfe fragen wollte. Ich hab auch gegoogled aber wollte nicht komplett etwas fertiges benutzen und hatte das Gefühl, dass vieles veraltet war oder ziemlich wirr.

Ich hatte folgende Überlegung wie beim Registrieren:
1. Verbindung zur Datenbank (klar)
2. ein query womit geschaut wird ob die Email und das Passwort welches eingegeben wurde (gehasht) in der DB vorhanden ist
3. wenn ja einloggen und zum Userpanel weiterleiten (HTTP Redirect?)

Das dürfte aber so wahrscheinlich zu mager sein, da mir noch Sessions etc. fehlen da ich möchte das der User sich nicht nach 5 Minuten wieder einloggen muss..

Ein Loginscript mag einfach sein aber ich hab leider meine Probleme damit :D


proudy
 
Die Logininformationen werden ja in ein Formular eingetragen indem man einstellen kann wohin die Infos bei einem Submit übertragen werden sollen. In der entsprechenden Datei kannst du die Informationen aus dem Post-Array (sorry weiß nicht mehr wie es genau heißt $_POST oder so) herauslesen und dementsprechend was anderes anzeigen. Zudem legst du bei einem erfolgreichen Login eine neue Session an und kannst wenn du möchtest die zugehörige Session-Id in ein Cookie speichern.

also nochmal zusammengefasst
  1. Versuchen Cookie auszulesen
  2. Session unter Umständen wieder aufnehmen
  3. wenn du noch immer keine Session hast musst du schauen ob sich jemand eingeloggt hat.
    • wenn pw und user passen dann session anlegen
    • session in cookie speichern
  4. jetzt solltest du eine session haben -> eingeloggt seite anzeigen
  5. wenn nicht musst du irgendwie einen fehler anzeigen.

Ist nur ein sehr grober Fahrplan, da das bei mir schon ne ganze Weile her ist als ich sowas zuletzt gemacht hab. Falls ich irgendwo Quatsch erzählt hab (halte ich bei den Sessions und Cookies für nicht ganz unwahrscheinlich), dann verbessert mich bitte. Ich hoffe aber, dass ich dir trotzdem ein bisschen weiterhelfen konnte.
 
Danke dir.

Das mit dem $_POST hab ich auch in meinem Registrierungsformular, indem die eingebenen Informationen an meine Funktion übermittelt werden.
 
proudy3 schrieb:
Code:
	if (!filter_var($email, FILTER_VALIDATE_EMAIL))
		{
			return false;
		}
		
		
	$query = "SELECT ID FROM users WHERE email = '$email';";
	$result = mysqli_query($db, $query);
	if($result->num_rows > 0) { return false; }
Au, fein, darf ich mal, darf ich mal??

$email = "'||1=1#@gmail.com";
 
Also du solltest mindestens mysql_real_escape_string oder PDO verwenden, um das von proudy3 angesprochene Problem zu umgehen.

Und für deinen Login - woran hängt's denn? Auf der Seite erstmal ein session_start(); machen, um eine Session zu starten. Dann kannst du mit $_SESSION['key'] Daten in der Session speichern, z. B. die Info, ob ein Nutzer angemeldet ist. Zusätzliche Cookies brauchst du dafür erstmal nicht.

Und dann eine Weiterleitung mit header();

Bsp:

PHP:
header('Location: /meineSeite', TRUE, 302);
 
@Kanibal
Ich geh mal davon aus, dass die Methode die ich verwende um die E-mail zu überprüfen umgangen werden kann bzw. falsch ist?

@Exterior
Danke, werd mich nachher im Unterricht ransetzen.
 
Das Problem nennt sich SQL Injection und kann mit mysql_real_escape_string entschärft werden (Sonderzeichen wie SQL-Operatoren werden maskiert) oder mit PDO und prepared statements ziemlich sicher vermieden werden.
 
Ah, hab mich darüber auch schon informiert und deshalb das mit dem Escapen gemacht (siehe Registrierung).

Jedenfalls teste ich gerade mein Loginscript und komm nicht weiter, hab mir das mit den Sessions gegoogled und den Rest so ähnlich wie bei meiner Registrierung gemacht.

Loginfunktion:
Code:
<?php	
session_start();	
function login($email, $password)
{
	include_once ('../core/config.php');
	
	//Verbindung zur MySQL Datenbank
	$db = mysqli_connect(DB_host, DB_user, DB_password, DB_base) or die ("Keine Verbindung möglich");
	
	if(empty($_POST['email']) || empty($_POST['password']))
	{
		echo "Bitte alle Felder ausfüllen";
		return false;
	}
		else
			{
				$query = "SELECT email, password,
						  FROM users
						  WHERE email = '".mysql_real_escape_string($_POST['email'])."'
						  AND password = '".sha256($_POST['password'])."'
						  ";
						  
				$result = mysqli_query($db, $query);
				if($result->num_rows != 1)
				{
					echo "falsche daten";
					return false;
				}
		
				else
				{
					$_SESSION['login'] = TRUE;
					$_SESSION['email'] = $_POST['email'];				
					exit();
			}
		}	
}
?>

mein Loginformular:
Code:
<html>
	<head>
		<title>Anmeldung</title>
	</head>
	<body>
		<center>
		<h1> PHP-Schulprojekt - Anmeldung </h1>
		<form action="./loginform.php" method="post">
			<b> E-Mail: </b><br>
			<input type="text" name="email size="10"><br>			
			<b> Passwort: </b> <br>
			<input type="password" name="password" size="10"><br>
		<input type="submit" name="submit" value="Login">		
		</form>
		</center>
	
	</body>
	<?php
	
		if (isset($_POST['submit']))
		{
			$password = $_POST['password'];
			$email = $_POST['email'];
			
			include_once('../core/login.php');
			if(login($email, $password))  
				{
					header('location: cpanel.php');
				}
			else
				{
					echo "Fehler! (Passwort/EMail)";
				}			
			
		}
	?>
</html>

Sieht leider etwas komisch verrückt aus, liegt wohl an der Formation.

Hab eine Session gestartet, dann meine Loginfunktion geschrieben (die einloggt mit der E-Mail Adresse und nicht mit dem Username) und mit einer if-Abfrage die Überprüfung. Bei meiner Loginform hab ich unten einen PHP Abschnitt wie bei meinem Registrierungsformular, da funktioniert es.

Der Fehler der beim drücken auf den Loginbutton kommt: Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /users/tlsero/www/pages/loginform.php:18) in /users/tlsero/www/core/login.php on line 2
Bitte alle Felder ausfüllenFehler! (Passwort/EMail)
 
Zuletzt bearbeitet:
Das session_start() muss ganz am Anfang kommen. Bevor irgendetwas anderes zum Browser geschickt wird. Siehe die Beiden Beispiele

liefert den Fehler
Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<?php session_start(); ?>
<html>
<head>
...

sollte fehlerfrei laufen
Code:
<?php session_start(); ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
...

http://php.net/manual/de/function.session-start.php
 
Zuletzt bearbeitet: (Edith hat gesagt ich soll den Link noch einfügen.)
Zurück
Oben