[PHP] Login mit PHP und MySQL

krizzelfix

Commander
Registriert
Sep. 2005
Beiträge
2.626
Moin zusammen,

Ich will mir eine PHP Script schreiben das überprüft ob man sich schon angemeldet hat. Die Userdaten sollen in einer MySQL Datenbank gespeichert werden.
Bis jetzt habe ich mir zwei user in der Datenbank angelegt um alles zu testen aber das Script gibt immer aus das der user nicht gefunden wurde.


PHP:
<?php 
$DatabasePointer = mysql_connect("127.0.0.1", "name" , "pass");
mysql_select_db("tewes_01", $DatabasePointer);
$username=$_POST['username'];
$password=$_POST['password'];
$sql_query = mysql_query("SELECT passwort FROM member WHERE nick='".stripslashes($_REQUEST['username'])."'" ) ;
$row = mysql_fetch_array($sql_query);

if ($password ==  $row['password'])
	{
        echo "Willkommen, $username!";
    }
else
    {
        echo"Der User und/oder das Passwort wurden nicht gefunden!";
    }
?>

Danke im Vorraus

MFG

TeWeS
 
AW: [PHP]Login mit PHP und MySQL

PHP:
$sql_query = mysql_query("SELECT passwort FROM member WHERE nick='".stripslashes($_REQUEST['username'])."'" ) ;

Probiers mal mit.

PHP:
$sql ="SELECT 
         passwort 
FROM
     member 
WHERE nick='".mysql_real_escape_string($username)."';";

$result = mysql_query($sql) or die(mysql_error());

$row = mysql_fetch_array($result);

//edit
Oh stimmt. Den Fehler hab ich nicht gesehen.
Also vergiss, was ich geschrieben habe.
 
Zuletzt bearbeitet:
AW: [PHP]Login mit PHP und MySQL

Hallo,

der Fehler besteht wohl darin, dass du in der Abfrage "passwort" abfrägst und in dem Array auf das Element mit dem Index "password" zugreifst. ;)
Daneben verstehe ich die Funktion stripslashes() in diesem Kontext nicht. Gerade umgekehrt solltest du bei deaktivierten MagicQuotes die entsprechenden Steuerzeichen maskieren. So ist dein Script leicht für SQL-Injections anfällig.
Daneben solltest du auch überprüfen, ob überhaupt entsprechende Datensätze existieren (z.B. mit mysql_num_rows()) da man sich sonst einfach mit einem x-beliebigen, nicht vorhandenen Benutzernamen ohne die Eingabe eines Passworts anmelden kann. ;)

MfG mh1001
 
AW: [PHP]Login mit PHP und MySQL

das Scipt habe ich nich selbst geschrieben sondern habe es aus einem anderem Forum, und da war das auch mit mysql_num_rows($sql_query)>0 aber das hat auch nich funktioniert.

und mit passwort/d in meiner Datenbank heisst es passwort und aus der html maske kommt password....aber ich probiers mal wenn es überall mit t is

MFG

TeWeS

//edit: Ok es lag an dem d/t.....aber warum?? is für mich irgendwie unlogisch
 
AW: [PHP]Login mit PHP und MySQL

PHP:
SELECT passwort
Wenn du die Spalte "passwort" auswählst, dann greifst du mit $row['passwort'] auf deren Inhalt zu. Das d bei $_POST['password'] kann ja bleiben, wenn die Variable password heißt.

Und zu dem was mh1001 wegen den magic_quotes gesagt hat.
PHP:
    function array_stripslashes(&$var) {
        if(is_string($var)) {
            $var = stripslashes($var);
        }else{   
            if(is_array($var)) {
                foreach($var AS $key => $value) {
                    array_stripslashes($var[$key]);
                }
            }
        }
    }
Pack diese Funktion am besten in eine eigene Datei.
Und ruf bei jeder Seite am Anfang.
PHP:
  if(get_magic_quotes_gpc()) {
      array_stripslashes($_GET);
      array_stripslashes($_POST);
      array_stripslashes($_COOKIE);
  }
das auf.
Musst die Datei mit der Funktion natürlich am Anfang mit include() einbinden.
Dann kannst du sicher gehen, dass alle Backslahes entfernt sind.

@mh1001:
Dafür ausführlicher erklärt, als ich.
 
Zuletzt bearbeitet:
[...] //edit: Ok es lag an dem d/t.....aber warum?? is für mich irgendwie unlogisch
mysql_fetch_array() liefert den abgefragten Datensatz als ein assoziatives Array. Dabei werden die Feldnamen dem Feldinhalt zugeordnet. Und da dein Feld "passwort" heißt, ist auch der Index dieses Elements "passwort". ;)
Foglich kannst du im Endeffekt auch nur über $row['passwort'] darauf zugreifen. ;)

MfG mh1001

//Edit: Auch schon im neuen Jahr schon wieder zu langsam. ;)

//Edit2:

Obige Variante ist des "MagicQuote-Handlings" ist durchaus zu empfehlen, allerdings musst du dann darauf achten, dass du bei sämtlichen Datenbankabfrage die Strings auch wieder mit addslashes() maskierst.
Wenn du viel mit Datenbankabfragen arbeitest ist es vielleicht besser, wenn du das genau umdrehst. ;)

Ich persönlich löse das immer mit diesen beiden Funktionen:

PHP:
function maskieren($string)
{
  if(get_magic_quotes_gpc())
  {
    $format = $string;
  }
  else
  {
    $format = addslashes($string);
  }

  return $format;
}

function demaskieren($string)
{
  if(get_magic_quotes_gpc())
  {
    $format = stripslashes($string);
  }
  else
  {
    $format = $string;
  }

  return $format;
}
 
Zuletzt bearbeitet:
aso ich glaub jetzt habe ich das verstanden

Thx für eure hilfe

//edit: So viele Datenbank aufrufe wird es wohl nicht geben da ich nur ~100 seitenaufrufe am Tag habe...

//edit2: hab nochmal ne frage zu en Scripten....das is doch nicht php oder??? ich finde das sieht erher nach js aus.
Und wie und wo muss ich die in meine Quellcode einbauen??

MFG

TeWeS
 
Zuletzt bearbeitet:
@mh1001:
Cool. Die Funktionen werd ich mir mal merken, aber ich ändere jetzt nicht alles um.
Ich überge sämtliche Werte immer mit mysql_real_escape_string() aber maskieren() klingt natürlich gleich ganz anders.

Das ist alles PHP Code ;)
Die Funktionen von mh1001 sind dazu da, um Daten vor der Datenbankabfrage zu maskieren.

Wenn du diese Funktionen verwendest, dann sieht deine Abfrage so aus:
PHP:
$sql_query = mysql_query("SELECT passwort FROM member WHERE nick='".maskieren($_POST['username'])."'" ) ;
 
Zuletzt bearbeitet:
und wie muss ich die einbinden...muss ich die in einer externen Datei speichern und dann auf jeder seite die ich schützen will einbinden oder wie??
 
Ja, bevor du die entsprechenden Funktionen verwenden kannst müssen diese erst initialisiert und deklariert werden. Dies geschieht mit obigen Codeteilen.
Dieser Codeteil muss immer vor dem ersten Aufruf vorhanden sein. Ein Einbinden mit include() bietet sich somit an. ;)

MfG mh1001
 
also müsste mein code dann so aussehen:
PHP:
<?php 
include 'function.php';
$DatabasePointer = mysql_connect("127.0.0.1", "name" , "pass");
mysql_select_db("tewes_01", $DatabasePointer);
$username=$_POST['username'];
$passwort=$_POST['passwort'];
$sql_query = mysql_query("SELECT passwort FROM member WHERE nick='".maskieren($_POST['username'])."'" ) ;  
$row = mysql_fetch_array($sql_query);

if ($password ==  $row['password'])
    {   
	     echo "Willkommen, $username!";
    }
else 
    {
        echo"Der User und/oder das Passwort wurden nicht gefunden!";
    }
?>
 
PHP:
<?php 
if ( (mysql_num_rows($sql_query) != 0) && ($password ==  $row['password']) )
?>
 
thx für die Hilfe....

aber wie bekomme ich es noch hin das angezeigt wird wann der user das letzte mal online war??

PHP:
$ResultPointer = mysql_query("SELECT online FROM member", $DatabasePointer);

PHP:
$time = mysql_fetch_object($ResultPointer);

PHP:
 echo $time;

habe die sachen jetzt noch eingefügt......und im Browser gibt der jetzt Object id #1 aus.


MFG


tewes
 
man sollte leute hauen die kein md5 bei pw benutzen so eine achtlosigkeit ... oder ein ander has/verschlüsselung methode
 
mysql_fetch_object() sagt ja schon, dass es ein Objekt zurückgibt.
Also kannst du schonmal nicht echo $time; sagen. Sondern echo $time->online;

Deine SQL-Abfrage sieht auch nicht richtig aus.
Du musst ja auch angeben von welchem User die Spalte online genommen werden soll, also...
PHP:
$ResultPointer = mysql_query("SELECT online FROM member WHERE nick='".$nick."'", $DatabasePointer);
In der Variablen $nick muss halt der Benutzername stehen.

@AlbertLast:
Danke, das hab ich auch noch vergessen zu sagen.
Mach als Passwort eine Spalte mit 32 Zeichen (VARCHAR(32)) und speichere das Passwort mit md5($passwort); ab. Überprüf dann in der Abfrage die Prüfsumme, also

PHP:
if ( (mysql_num_rows($sql_query) != 0) && (md5($password) ==  $row['password']) )
 
Zuletzt bearbeitet:
@AlbertLast: Wie macht man das denn mit verschlüsseln??

@Quidoff: achso thx....

//edit: Aber wenn ich jetzt mich anmelden will dann sagt er mir das das Passwort nich gefunden wurde...
 
Zuletzt bearbeitet:
tewes schrieb:
@AlbertLast: Wie macht man das denn mit verschlüsseln?? [...]
Wie Quidoff es in seinem obigen Post schon angesprochen hat, stellt PHP dazu die Funktion md5() zur Verfügung. In MySQL ist ebenfalls die Funktion MD5() dazu vorhanden.
Wie schon gesagt liefern die beiden Funktionen einen 32-Zeichen langen Hash-Wert des übergebenen Strings zurück.
Wenn du Quidoffs Code verwendest musst du lediglich darauf achten, dass die Passwörter auch schon MD5-"Verschlüsselt" eingetragen sind/werden. Dazu kannst du ebenfalls diese PHP/MySQL-Funktionen verwenden.

MfG mh1001

//Edit:

[...]Aber wenn ich jetzt mich anmelden will dann sagt er mir das das Passwort nich gefunden wurde...
Auch wieder auf das "t" und "d" geachtet und darauf, dass das Passwort auch korrekt "verschlüsselt" in der Datenbank vorliegt? ;)
 
Zuletzt bearbeitet:
um passwörter einzutragen habe ich noch kein script.....das habe ich bis jetzt immer über phpmyadmin gemacht......geht das auch darüber??
 
Ich hatte mal das Problem, dass die MD5() Funktion bei gleichem String einen anderen Wert erzeugt hat, als die md5() Funktion von PHP. Deshalb lass ich den Wert immer von php erzeugen und trag ihn dann als normalen String in die Datenbank ein.

//edit
PHP:
        $sql = "INSERT INTO user
                    (Name, Passwort, EMail, Datum)
                VALUES
                    ('".mysql_real_escape_string(trim($_POST['username']))."',
                     '".md5($_POST['pw'])."',
                     '".mysql_real_escape_string($_POST['email'])."',
                     NOW());";
                        
                
        mysql_query($sql) or die(mysql_error());
 
Zuletzt bearbeitet:
@Quidoff

Bist du dir sicher, dass du nicht zufällig eine verbuggte MySQL-Version erwischt hast oder zufällig irgendwelche unerwünschten Whitespace-Zeichen oder Escape-Zeichen im übergebenen Parameter hattest?
Sonst wäre ja der Sinn als weit verbreiter Prüfsummen-Algorithmus völlig hinüber. ;)

@tewes

Über die grafische Oberfläche von phpMyAdmin kannst du auch direkt über das "Funktion"-Selectmenü "MD5" wählen.

MfG mh1001
 
Zurück
Oben