PHP Abfrage Richtigkeit von verschlüsselten Passswörtern

Aeefire

Ensign
Registriert
Sep. 2010
Beiträge
186
Servus!
Ich lese mich grad seid ca 2 Stunden durch diverse homepages und foren, aber finde keine "dummy"-antwort für meine frage:
einmal vorraus: ich bin php-neuling.


ich hab nen loginscript gebaut auf basis einer vorlage im internet [ http://www.testx.ch/2009/05/einfaches-php-login/ ]
mit allem drum und dran, also session usw. nur hat dieserjenige keine verschlüsselung des passworts reingebaut was ich aber haben wollte. mit der funktion PASSWORD() im "INSERT"-string (hoffe ich drück mich da richtig aus ;) ). habe ich mein passwort verschlüsselt und mir meine "registrierung" selbst gebaut

Code:
	<?
	include('connect.php');
	$name=$_POST["Name"];
	$pw=$_POST["password"];
	if (isset($name) && isset($pw))
		{
			
		$c=mysql_connect("xxxxxx","xxxxxx","xxxxx");
		$result=mysql_db_query(xxxxxx,"INSERT INTO loginscript (username,password) VALUES ('$name',PASSWORD('$pw'))");
		$select=mysql_db_query(xxxxxx,"select * from loginscript");
		while ($r = mysql_fetch_row($select))
			{
				echo $r[0]."   ".$r[1]." ".$r[2]."<br>";
			}
		mysql_close;
		}
	?>

so sieht das ganze dann aus, was auch funktioniert.

nun ist meine frage wie frage ich nun ab ob das passwort auch richtig ist?
lösen wollte ich das dann im script, das mich der abfrage des users + des passworts beschäftigt folgender maßen:
Code:
$password=PASSWORD($_POST['password']);
.....
if($password != $result['password']){
echo "Username oder Passwort falsch!";
header('location:loginform.php');
die();
...
was aber wie erwartet nicht funktionierte bzw wird mir garnichts mehr angezeigt.

jemand hier eine einfache lösung? :)
danke im vorraus
Ergänzung ()

ich häng noch das script für die loginabfrage komplett an:

Code:
<?php
include('connect.php');
include('loginform.php')
$username=$_POST['username'];
$password=$_POST['password'];
 
$query=mysql_query("SELECT username, password FROM users WHERE username ='".$username."'") or die("konnte nicht selecten!!!");
mysql_real_escape_string($username);
mysql_real_escape_string($password);
$result=mysql_fetch_array($query);
$check = checkPassword($_POST('password')
 
if(!$result['username']){
echo "Username oder Passwort falsch!";
header('location:loginform.php');
die();
}

if($password != $result['password']){
echo "Username oder Passwort falsch!";
header('location:loginform.php');
die();
}

session_register('username');
echo "Du bist erfolgreich registriert!";

?>
 
Okay, da gibt es ein par Dinge anzumerken:

1. Du mußt $username escapen (mit mysql_real_escape_string), bevor du ihn in die SQL-Abfrage einsetzt. Außerdem muß das Escapen so aussehen:
PHP:
$username = mysql_real_escape_string($username);
So, wie du es momentan machst, passiert gar nichts.

Das gleiche gilt übrigens für $username in deinem ersten Listing. Ohne Escapen besteht die Gefahr von SQL-Injection-Attacken.

2. Wenn du header() benutzt, darfst du vorher nichts ausgegeben haben. Die echos müssen da weg.

3. Die Zeile
PHP:
$check = checkPassword($_POST('password')
sieht irgendwie unvollständig und aus dem Zusammenhang gerissen aus, zumal du $check nirgendwo benutzt. Prüf noch mal, ob du den Code hier richtig hereinkopiert hast.

4. Laut MySQL-Handbuch soll man PASSWORD() nicht in eigenen Pogrammen benutzen, sondern Paßwörter mit MD5() oder SHA1() hashen. Ich empfehle letzteres.

5. Da $result['password'] gehasht ist, mußt du auch $password hashen, damit ein Vergleich der beiden wiklich etwas bringt. Also (unter der Annahme, daß du PASSWORD() durch SHA1() ersetzt hast)
PHP:
if (sha1($password)) != $result['password'])
 
NullPointer schrieb:
Okay, da gibt es ein par Dinge anzumerken:

1. Du mußt $username escapen (mit mysql_real_escape_string), bevor du ihn in die SQL-Abfrage einsetzt. Außerdem muß das Escapen so aussehen:
PHP:
$username = mysql_real_escape_string($username);
So, wie du es momentan machst, passiert gar nichts.

Das gleiche gilt übrigens für $username in deinem ersten Listing. Ohne Escapen besteht die Gefahr von SQL-Injection-Attacken.

2. Wenn du header() benutzt, darfst du vorher nichts ausgegeben haben. Die echos müssen da weg.

3. Die Zeile
PHP:
$check = checkPassword($_POST('password')
sieht irgendwie unvollständig und aus dem Zusammenhang gerissen aus, zumal du $check nirgendwo benutzt. Prüf noch mal, ob du den Code hier richtig hereinkopiert hast.

4. Laut MySQL-Handbuch soll man PASSWORD() nicht in eigenen Pogrammen benutzen, sondern Paßwörter mit MD5() oder SHA1() hashen. Ich empfehle letzteres.

5. Da $result['password'] gehasht ist, mußt du auch $password hashen, damit ein Vergleich der beiden wiklich etwas bringt. Also (unter der Annahme, daß du PASSWORD() durch SHA1() ersetzt hast)
PHP:
if (sha1($password)) != $result['password'])


ad1)
dashab ich so rauskopiert und muss mich erst noch informieren für was genau das zuständig ist, aber erstmal danke.

ad2) selbiges wie 1)

ad3) das ist nen relikt eines versuchs meinerseids, sollte eigentlich nichtmehr drinnen sein

ad4) ok dann werd ich das mal machen

5.) argh auf das hätt ich auch draufkommen können ;) danke vielmals

werde das alles dann am nachmittag/abend ausprobieren. atm keine zeit dazu, bin auf der uni....

werde dann berichten obs ging ;)
 
irgendwie zeigts mir noch immer nix an :)

hab jetz das ganze auf folgendes geändert:
Code:
<?php
// login.php
include('connect.php');
include('loginform.php')
$username=$_POST['username'];
$password=$_POST['password'];
 
$query=mysql_query("SELECT username, password FROM users WHERE username ='".$username."'") or die("konnte nicht selecten!!!");
$username = mysql_real_escape_string($username); 
$password = mysql_real_escape_string($username); 
$result=mysql_fetch_array($query);

 
if(!$result['username']){
echo "username falsch"
die();
}

if(SHA1($password) != $result['password'])
{
echo "passwort falsch"
die();
}

session_register('username');
echo "Du bist erfolgreich registriert!";

?>

Code:
<?php
// connect.php
include('config.php');
$connect=mysql_connect("$dbhost", "$dbuser", "$dbpassword") OR die("Konnte keine Verbindung aufbauen.");
$select=mysql_select_db("$dbdatenbank") OR die("Konnte keine Verbindung aufbauen.");
?>

Code:
<?php
// checker.php
session_start();
if(!session_is_registered('username'))
{
echo "Du hast keinen Zutritt!";
die();
}
?>

aer irgendwie zeigts mir noch immer nix an..
 
Du rufst die checker.php auf? Dann bau doch mal eine echo-Ausgabe (à la "Du hast Zutritt") ein für den Fall, daß die if-Bedingung nicht eintritt. Laß die am besten bei der Gelegenheit auch den Inhalt von $_SESSION['username'] an. Vielleicht steht da ja noch was drin?
 
Code:
<?php
// checker.php
session_start();
$sessionusername=$_SESSION['username'];
if(!session_is_registered('username'))
{
echo "Du hast keinen Zutritt!";
echo $sessionusername;
die();
}
else
{
echo "Du hast Zutritt!";
echo $sessionusername;
}
?>
also so? probiert und funktioniert nicht -.- :freak:
 
Es wird also gar nichts ausgegeben? Das kann dann eigentlich nur bedeuten, daß irgendwo ein Fehler auftritt und dein PHP so konfiguriert ist, daß es die Meldung nicht anzeigt. Solltest du mal überprüfen, denn ohne Fehlermeldungen entwickelt es sich echt schlecht :)
 
also nach dem 3. browser den ich probiert hab (IE^^) kam nun auch ne fehlermeldung, die aber nicht sehr aussagekräftig ist würd ich sagen:

Code:
Die Website kann diese Seite nicht anzeigen. 
 HTTP 500  
   Wahrscheinlichste Ursachen:
•Die Website wird momentan gewartet.
•Die Website enthält einen Programmierfehler.
 
HTTP 500 heißt "Interner Serverfehler". Das bedeutet, daß beim Verarbeiten deines Skripts etwas gründlich schief läuft, so daß der Server dir nicht einmal sagen kann, was ^^
 
Aeefire schrieb:
Code:
<?php
...
 $query=mysql_query("SELECT username, password FROM users WHERE username ='".$username."'") or die("konnte nicht selecten!!!");
$username = mysql_real_escape_string($username); 
$password = mysql_real_escape_string($username); 
$result=mysql_fetch_array($query);
...

das ganze ist falsch so

das mysql_real_escape_string muss vor dem mysql_query kommen da du ansonnsten immernoch gefahr läufst opfer von SQL Injection zu werden.

Desweiteren würde ich aus Sicherheitsgründen noch vorschlagen:
Jedes Passwort wird von dir, um ein von dir gesetzten Zeichensatz vorweg ergänzt. Das hat die Sicherheit fals doch einmal einer eine SQL injection erfolgreich schafft oder auf andere weiße direkt an die Datenbank kommt trotzdem nichts anfangen kann. Im Internet gibt es CDs zum Herunterladen welche MD5 hashes für jedes Passwort von 1 bis X zeichen enthalten. Dort müssen dann nur noch die Hashes vergleichen werden und du hast das Passwort. Und mit Benutzernamen und Passwort kann man auf einer anderen Seite evtl. einkaufen gehen auf fremde Rechnung.

Zu deinem Problem: Evtl hilft es noch weiter Debug ausgaben zu erstellen (das Header() würde ich vorerst vernachlässigen bei HTTP 500) oder im PHP das Errorreporting auf einen anderen Level zu setzen.
 
gigajum schrieb:
Jedes Passwort wird von dir, um ein von dir gesetzten Zeichensatz vorweg ergänzt.
PHP:
function convertpw($pass)
{
$salt = "kW2miDMjeluk";
//$pass = sha1($salt.$pass);
$pass = md5($salt.$pass);

return $pass;
}
falls Du fragen solltest ;)

ähm ja .. 500er ist wirklich nicht sehr prickelnd :D

error_reporting könnte vllt etwas helfen
 
Zurück
Oben