Registrierungsformular - überprüfen, ob der Benutzername bereits existiert

Harry Fan8

Mitglied
Hey,

hab nen kleines Problem. Nämlich ich hab ein Registrierungsformular für meine Webseite erstellt. (Mit Benutzername, Email & Passwort) Nur nun hab ich das Problem, das man mehrmals mit dem gleichen Accountname registrieren kann. Aber das möchte ich irgendwie vermeiden, aber ich weiß nicht wie. Vllt könntet ihr mir da irgendwie weiterhelfen. :)

Möchte nämlich, dass er aus der Datenbank den Benutzername herausfiltert, und mit der Eingabe des Formulars überprüft.

Mein bisheriger Code sieht bis jetzt so aus:
Formular:
HTML:
<b>Bitte gib deine Registrierungsdaten an:</b>
<FORM METHOD=POST>
  Benutzername:<br>
  <input type="Text" name="user" value="">
  <br><br>
  EMail-Adresse:<br>
  <input type="Text" name="email" value="">
  <br><br>
  EMail-Adresse bestätigen:<br>
  <input type="Text" name="emailagain" value="">
  <br><br>
  Passwort:<br>
  <input type="Password" name="kenn" value="">
  <br><br>
  Passwort bestätigen:<br>
  <input type="Password" name="kennagain" value="">
  <br><br>
  <input type="submit" name="absenden" value="Registrieren">
</FORM>

Jeweilige PHP-Code zum Formular:
PHP:
<?php
	$geld = 20000;
	$mail = $_POST['email'];
	$benutzer = $_COOKIE['Benutzer'];
	
	$eingabeUSER = $_POST['user'];
	
	$abfrage = "SELECT * FROM city WHERE Benutzer = $benutzer";
	$data = mysql_query($abfrage);

	if($_POST['user'] && $_POST['email'] && $_POST['emailagain'] && $_POST['kenn'] && $_POST['kennagain']) {
		if (ereg('^[a-z0-9]+([-_.]?[a-z0-9])+@[a-z0-9]+([-_.]?[a-z0-9])+.[a-z]{2,4}', $mail)) { //wird überprüft, ob es eine EMail-Adresse ist
			if(!$eingabeUSER == $data) { //wird überprüft, ob die Eingabe == die Daten in der Datenbank sind. Falls das der Fall ist, soll eine Fehlermeldung wiedergegen werden, sonst erfolgreich die Registrierung abwickeln.
				$sql = "
					INSERT INTO `city`
					(
					`Benutzer` , `Kennwort` , `Email`, `Geld`
					)
					VALUES
					(
					'".$_POST['user']."', '".$_POST['kenn']."', '".$_POST['email']."', '".$geld."'
					);
					";

					mysql_query($sql)
						or die("Fehler, irgendetwas lief bei der Registrierung schief.");
						echo "Herzlichen Glückwunsch, du hast dich soeben Erfolgreich registriert!";
						
			} else {
				echo "Benutzername existiert bereits."; //Falls bereits ein Benutzername mit dem Namen, in der Datenbank existiert, soll er ein Fehler ausgeben.
			}
		} else {
			echo "Email-Adresse stimmt nicht überein.";
		}
	} else if($_POST['email'] != $_POST['emailagain']) {
				echo "Email-Adressen stimmen nicht überein.";
			} else if($_POST['kenn'] != $_POST['kennagain']) {
				echo "Passwörter stimmen nicht überein.";
			} else if($_POST['absenden']) {
				echo "Bitte alle Felder ausfüllen!";
			}
?>

Das meiste davon sind Codeschnipel, aber einiges habe ich davon auch selbst gemacht. Ich sag aber jetzt schonmal danke für jede Antwort, die ihr dazu gibt.

MfG
Harry Fan8
 
Meiner Meinung nach gibt das hier zwei Mögliche Vorgehensweisen:

1) Du setzt das Usernamefeld in deiner Datenbank auf unique
2) Du nutzt diese funktion
PHP:
function user_exsits($username)
{
	$result = mysql_query("Select Benutzer From `city` where Benutzer = '$username'");
	if($result)
	{
		return true;
	}
	else
	{
		return false;
	}
}

P.S. Deine E-Mail überprüfung ist etwas veraltet, [phpf]ereg[/phpf] ist seit PHP 5.3.0 veraltet.
Hier hast du eine Funktion die sowohl die Formalien überprüft als ob die Domain exsistiert.
https://gist.github.com/4410719

Mit freundlichen Grüßen
Leon Bergmann
 
Zuletzt bearbeitet:
Okay, danke für die schnelle Antwort. Aber bei der 1. Vorgehensweise weiß ich leider nicht weiter. Bin noch ein ****ie in PHP^^, aber find das irgendwie nicht. Unter Typ hab ich zurzeit VARCHAR stehen, aber da steht nichts mit unique. Und unter Collation steht auch nichts mit unique.

Brauche dringend Hilfe!
 
Zuletzt bearbeitet:
Folgendes ich denke mal du nutzt phpmyadmin zur verwaltung deinr Tabellen bzw. Datenbanken. Dann ist das unique unter extras zu finden. Oder wenns schnell gehen soll folgende SQL
 
Zuletzt bearbeitet:
Achso, danke. Hab auch falsch geguckt.^^ Ich dummy hab auf bearbeiten geklickt, und hab das dort gesucht. xD Werds jetzt nochmal ausprobieren, hoffe es funkt.

EDIT: Es funktioniert, dankeschön. :) Aber kriegt man das auch so hin, dass wenn der Benutzername nicht existiert über die else funktion läuft? und nicht über or die(""); . Denn or die benutzt man doch, wenns Fehler mit der Datenbank gibt, oder? oder irre ich mich da gerade?^^

EDIT 2: Okay, hab mich wohl doch geirrt. Denn für die Fehler ist ja mysql_connect da oder mysql_select_db.

MfG
Harry Fan8

Hey,
hab dann mal noch ne kleine Frage: Ist es auch irgendwie möglich Passwörter bei Registrierung zu verschlüsseln, und bei der Anmeldung zu entschlüsseln? Wenn ja, wie?

Gruß Harry
 
PHP:
<?php

// Autor: Leon Bergmann

// Date: 06.11.2012 13:18 Uhr

// Leon Bergmann - 30.12.2012 14:07 Uhrr

class passwordAPI

{

private $rounds = 5;

private $method = 'SHA512';

public function crypt($text,$salt)

{

$tmp = $text;

for($i = 0; $i <= $this->rounds; $i++)

{

$tmp = $tmp.$salt;

$tmp = hash($this->method,$tmp);

}

return $tmp;

}

public function createASalt()

{

$salt = self::randomChars(255);

$salt = hash($this->method,$salt);

return $salt;

}

public static function randomChars($laenge)

{

$inhalt='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

$string = "";

srand(microtime()*1000000);

for($i=1;$i<=$laenge;$i++)

{

$index	= rand(1,strlen($inhalt));

$index--;

$string	.= $inhalt{$index};

}

return $string;

}

}

 

 

?>
von: Leon Bergmann, Quelle: https://gist.github.com/4412816

Könnte man das auch irgendwie einfacher gestalten? :/ Sieht für mich als Anfänger noch recht kompliziert aus. Wofür ist die Variable $round da? Sind das die Login-Versuche für Einloggen, oder wie? Und wozu braucht man diese Funktion?: public static function randomChars($laenge)
Ist die Funktion unbedingt notwendig? Wozu muss man das Passwort denn salzen, wenn es doch schon unknackbar ist?

Sorry für die vielen Fragen, bin noch neu in dem Bereich. :/

mfg harry
 
Zuletzt bearbeitet:
Die Variable $round ist für die for-Schleife gedacht, sie gibt an wie oft das passwort gehasht werden soll.
Auch wenn bis jetzt kein effektiver Angriff auf sha512 bekannt ist, ist es doch möglich mit sehr großen Rainbowtables das Passwort zu rekonstruieren, deshalb sollte man vorsichtshalber einen Salt verwenden.
 
Zuletzt bearbeitet:
Sorry für die vielen Fragen, bin noch neu in dem Bereich. :/
Da vllt. noch Verwirrung vorhanden ist:

Das Vorgehen beim Hashen prinzipiell:
Registrieren: PW mit der (in der Theorie unumkehrbaren) Hashfunktion behandeln
und Ergebnis in die DB.
Anmeldung: Eingegebenes PW mit der selben hashfunktion hashen
und den neuen Hash mit dem in der DB vergleichen.

Der Hash hat uA. die Egenschaften, dass man eben nichts rück-"verschlüsseln" kann
und verschiedene Passwörter auch (sehr) verschiedene Hashes erzeugen.

Man kann also nicht von ähnlichen Hashes darauf schließen, dass der Klartext auch ähnlich ist.

Von den verschiedenen vorhandenen Verfahren sind einige nicht mehr so toll, weil inzwischen Möglichkeiten bekannt sind, sie in annehmbarer Zeit doch umzukehren.
(annehmbare Zeit = nicht zehntausende Jahre++)


In PHP sind einige Hashmethoden fertig vorhanden und mit einem Einzeiler aufrufbar.
Skydevments Klasse hat noch zusätzlich, dass das Ganze mehrmals durchgeführt wird
und dabei auch gezielt Unsinnsdaten zum PW dazukommen.

Es gibt nämlich zB. Listen von häufigen Passwörtern, dazu problemlos die Hashes generiert,
und dann muss man nur die Hashes durchsuchen, ob der, den man knacken will,
vielleicht dabei ist. Diese Angriffsart wäre damit sinnlos.
 
Zurück