• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Login Session Problem

Kebab

Boskoop
Registriert
22.02.15
Beiträge
39
Hallo zusammen

Ich habe eine Registration und ein Login erstellt, welches an sich mit der DB zusammen funktioniert. Mein Problem ist, wenn der Code erkennt das ich eingeloggt bin sollte er das GUI von Login auf Members umstellen. Daran sieht man eigentlich sehr gut das die Session nicht richtig funktioniert.

Der Header Script mit dem Session Start:
PHP:
<?php
session_start();
include ( './includes/functions.php' );
include ( './includes/connect_to_mysql.php' );
$user = "";
if (isset($_SESSION['username'])) {
$user = $_SESSION['username'];
}
else
{
$user = "";
}
?>
<?php if ($user == "") { echo '
                        <li class="menu_login"><a href="login.php">LOGIN</a></li>
                        <li class="menu_join"><a href="join.php">CREATE AN ACCOUNT</a></li>
                         ';
                         }
                         else
                         {
                        echo '<li class="menu_login"><a href="members.php">MEMBERS</a></li>
                        <li class="menu_login"><a href="logout.php">LOGOUT</a></li>';
                         }
                         ?>

Der Login Script:
PHP:
<?php
include ( './includes/header.php' );

if (isset($_POST['username'])&&($_POST['password'])) {
  $username = strip_tags($_POST['username']);
  $password = strip_tags($_POST['password']);
  echo $username;
$check_username = mysql_query("SELECT username FROM users WHERE username='$username'");
$numrows = mysql_num_rows($check_username);
if ($numrows != 1) {
  echo 'That User doesn\'t exist.';
}
else
{
  $check_password = mysql_query("SELECT password FROM users WHERE password='$password' && username='$username'");
  while ($row = mysql_fetch_assoc($check_password)) {
   $password_db = $row['password'];
  
   if ($password_db == $password) {
     $_SESSION['username'] = $username;
    header("Location: members.php");
   }
  }
}
}

?>

Kann mir vielleicht jemand helfen der schon öfters mit Sessions gearbeitet hat oder den Fehler entdeckt?

Vielen Dank
Kebab
 

mkr*

Murer Reinette
Registriert
09.07.10
Beiträge
1.635
Bin mir da nicht hundertprozentig sicher, aber ich meine du musst in jedem php-Skript die Session starten, also auch noch mal session_start() im Loginskript.
 

Kebab

Boskoop
Registriert
22.02.15
Beiträge
39
Bin mir da nicht hundertprozentig sicher, aber ich meine du musst in jedem php-Skript die Session starten, also auch noch mal session_start() im Loginskript.
Ja, aber ich include ja den Header Script dort wird die Session dann gestartet!
 

timmy38233

Rhode Island Greening
Registriert
20.07.08
Beiträge
474
Im Login Script steht:
PHP:
if (isset($_POST['username'])&&($_POST['password'])) {

Da sollte noch ein zweites isset hin.

Ansonsten prüfe mal über var_dump oder echo Ausgaben, ob der gewünschte if-Zweig überhaupt durchlaufen wird. Nimm dazu die Zeile "header("Location…" mal raus und füge nach jedem if- / else-Block mal eine Testausgabe ein, damit Du siehst wie Dein Code abgearbeitet wird. Das verschafft oftmals Klarheit ;) Mit var_dump kannst Du ausserdem überprüfen, ob zB das Session-Array so aufgebaut ist, wie Du es Dir vorstellst (also ob $_SESSION["username"] überhaupt gesetzt wird, nachdem Du es mit $username gleichsetzt).

Generell sieht der Code recht unstrukturiert aus. Je nachdem wofür der Login sein soll und wie groß das Projekt wird, wäre es besser auch hier schon Objektorientiert zu arbeiten.

Und auch die MySQL-Statements würde ich so nicht schreiben… MySQLi mit Prepared Statements sollte hier das Mittel der Wahl sein, da Dein jetziger Code ziemlich unsicher ist. Es würde auch schon helfen das strip_tags durch mysql_real_escape_string zu ersetzen (Strip-Tags arbeitet mit HTML-Tags und schützt nicht wirksam gegen SQL Injections). Und ein Passwort sollte auch nicht im Klartext in der Datenbank stehen, sondern gehasht (nicht verschlüsselt!), bspw. mit der crypt() Funktion.

LG :)
 

Schniko

Reinette Coulon
Registriert
01.08.08
Beiträge
954
Funktioniert die SQL-Abfragen, wenn man Tabellennamen und co nicht in Anführungszeichen setzt? Es ist leider zu lang her bei mir, als dass ich mich daran noch erinnern kann.

Ansonsten kann ich mir meinem Vorredner nur anschließen: MySQL-Escape und Passwörter nicht im Klartext speichern!
 

timmy38233

Rhode Island Greening
Registriert
20.07.08
Beiträge
474
Ja, das funktioniert auch ohne Anführungszeichen. Nur bei Bezeichnern mit Leerzeichen benötigt man die eigentlich…
 

Kebab

Boskoop
Registriert
22.02.15
Beiträge
39
Im Login Script steht:
PHP:
if (isset($_POST['username'])&&($_POST['password'])) {

Da sollte noch ein zweites isset hin.

Ansonsten prüfe mal über var_dump oder echo Ausgaben, ob der gewünschte if-Zweig überhaupt durchlaufen wird. Nimm dazu die Zeile "header("Location…" mal raus und füge nach jedem if- / else-Block mal eine Testausgabe ein, damit Du siehst wie Dein Code abgearbeitet wird. Das verschafft oftmals Klarheit ;) Mit var_dump kannst Du ausserdem überprüfen, ob zB das Session-Array so aufgebaut ist, wie Du es Dir vorstellst (also ob $_SESSION["username"] überhaupt gesetzt wird, nachdem Du es mit $username gleichsetzt).

Generell sieht der Code recht unstrukturiert aus. Je nachdem wofür der Login sein soll und wie groß das Projekt wird, wäre es besser auch hier schon Objektorientiert zu arbeiten.

Und auch die MySQL-Statements würde ich so nicht schreiben… MySQLi mit Prepared Statements sollte hier das Mittel der Wahl sein, da Dein jetziger Code ziemlich unsicher ist. Es würde auch schon helfen das strip_tags durch mysql_real_escape_string zu ersetzen (Strip-Tags arbeitet mit HTML-Tags und schützt nicht wirksam gegen SQL Injections). Und ein Passwort sollte auch nicht im Klartext in der Datenbank stehen, sondern gehasht (nicht verschlüsselt!), bspw. mit der crypt() Funktion.

LG :)


okay vielen vielen Dank werde mal alles überprüfen!!
 

Kebab

Boskoop
Registriert
22.02.15
Beiträge
39
Vielen Dank dein Verdacht war richtig!
Der Code geht gar nicht in die if schleife oder das passwort stimmt nicht überrein.
PHP:
<?php
include ( './includes/header.php' );


if (isset($_POST['username'])&&(isset($_POST['password']))) {
  $username = strip_tags($_POST['username']);
  $password = strip_tags($_POST['password']);
  echo $username;
$check_username = mysql_query("SELECT username FROM users WHERE username='$username'");
$numrows = mysql_num_rows($check_username);
if ($numrows != 1) {
  echo 'That User doesn\'t exist.';
}
else
{
  $check_password = mysql_query("SELECT password FROM users WHERE password='$password' && username='$username'");
  while ($row = mysql_fetch_assoc($check_password)) {
   $password_db = $row['password'];
  
   if ($password_db == $password) {
     $_SESSION['username'] = $username;
     die('test');
    //header("Location: members.php");
   }
  }
}
}

Denn test erscheint nicht! An was kann das liegen. Verbindung zur DB hat es, da die Registrierung perfekt läuft. Und das richtige Passwort gebe ich auch ein.
 

timmy38233

Rhode Island Greening
Registriert
20.07.08
Beiträge
474
Setz vor dem letzten if mal folgenden var_dump ein und vergleiche die Ausgabe (wenn Du dir die ausgegebene Seite im Quellcode anzeigen lässt, bleiben auch die Zeilenumbrüche von var_dump erhalten):
Code:
var_dump($password_db);
var_dump($password);

Falls dieser nicht ausgegeben wird, wird nichtmal die while-Schleife betreten. Dann solltest Du dir dein SQL-Statement mal ausgeben lassen und per phpMyAdmin testen (falls das schon Fehler aufweisen sollte, wird pma dir das sagen).
 

Kebab

Boskoop
Registriert
22.02.15
Beiträge
39
Setz vor dem letzten if mal folgenden var_dump ein und vergleiche die Ausgabe (wenn Du dir die ausgegebene Seite im Quellcode anzeigen lässt, bleiben auch die Zeilenumbrüche von var_dump erhalten):
Code:
var_dump($password_db);
var_dump($password);

Falls dieser nicht ausgegeben wird, wird nichtmal die while-Schleife betreten. Dann solltest Du dir dein SQL-Statement mal ausgeben lassen und per phpMyAdmin testen (falls das schon Fehler aufweisen sollte, wird pma dir das sagen).


Danke, habe beide var_dump vor dem if platziert:
Code:
var_dump($password_db);
var_dump($password);
if ($password_db == $password) {
     $_SESSION['username'] = $username;
     die('test');
    //header("Location: members.php");
   }
  }
}
}

aber auf der Website passiert gar nichts. Bedeutet das, dass die beiden variablen leer sind?
 

timmy38233

Rhode Island Greening
Registriert
20.07.08
Beiträge
474
Anscheinend wird die While-Schleife nicht ausgeführt. (Wie auch unter meinem vorherigen Beitrag geschrieben ;))

Mach mal vor dem while ein vardump($check_password) und ein vardump von dem SQL-Statement (also alles was zwischen mysql_query(…) steht, inkl Variablen).
Das SQL-Statement dann einmal in phpMyAdmin, oder anderen MySQL Tools testen!
 
  • Like
Reaktionen: Kebab

Kebab

Boskoop
Registriert
22.02.15
Beiträge
39
Hallo timmy
Da ich das erste mal mit var_dump schaffe dachte ich, ich frage lieber nochmals nach, obwohl ich deinen Beitrag natürlich sehr genau durchgelesen habe;). Ich habe wie du empfohlen hast die 2 var_dumps gesetzt nur bin ich mir nicht ganz sicher ob die auch an dem richtigen Ort sind :eek:. Hier wäre der neue Code:
PHP:
  var_dump($check_password);
  $check_password = mysql_query("SELECT password FROM users WHERE password='$password' && username='$username'");
  var_dump($check_password);
  while ($row = mysql_fetch_assoc($check_password)) {
   $password_db = $row['password'];
  
  
   if ($password_db == $password) {
     $_SESSION['username'] = $username;
    
    //header("Location: members.php");

Als Fehlermeldung bekomme ich:
NULL resource(8) of type (mysql result)

Kannst du mir da weiterhelfen?

Vielen vielen Dank du bringst mich echt viel weiter als ich es jemals gekonnt hätte!!!:kiss:
Kebab
 

timmy38233

Rhode Island Greening
Registriert
20.07.08
Beiträge
474
Der erste var_dump ist unnötig, da die Variable $check_password dort noch nicht deklariert ist. Daher kommt auch das "NULL" in der Ausgabe (das ist keine Fehlermeldung, das ist die Ausgabe von var_dump) ;)

Das "resource(8) of type (mysql result)" zeigt, dass $check_password richtigerweise ein MySQL-Ergebnis enthält. Welches Ergebnis genau lässt sich so leider nicht rausfinden.

Mach mal statt dem ersten var_dump($check_password) ein
PHP:
var_dump("SELECT password FROM users WHERE password='$password' && username='$username'");
Und das zweite var_dump($check_password) ersetzt Du durch
PHP:
$assoc = mysql_fetch_assoc($check_password);
var_dump($assoc);
echo mysql_errno() . ": " . mysql_error(). "\n";


Zur Erklärung:

Mit dem neuen ersten var_dump guckst Du ob der SQL-String überhaupt funktioniert. Das was dort als Ergebnis ausgegeben wird, solltest Du über dein normales MySQL-Verwaltungstool (meistens phpMyAdmin) testen!

Die zweite Ausgabe prüft, ob das SQL einen gültigen Datensatz liefert und ruft anschließend noch die MySQL Error Ausgabe auf.


Tipp: Lass dir die Seite im Quelltext anzeigen (Chrome: alt+cmd+u), dann bleiben Zeilenumbrüche erhalten.
 
Zuletzt bearbeitet:

Kebab

Boskoop
Registriert
22.02.15
Beiträge
39
Vielen Dank habe ich sofort ausprobiert!
Ich bekomme dann das ausgegeben:
string(67) "SELECT password FROM users WHERE password='asdf' && username='asdf'" bool(false) 0:
Dies ist nur ein Test Account und dort habe ich auch noch keine Sicherheitsvorkehrungen darum ist das Passwort und der Username nicht sehr schlau gewählt:).
Wie kann ich das mit dem phpMyAdmin testen? Habe ich leider auch noch nie gemacht!:rolleyes:
Ich lade den neuen Code einfach per Uplaod hoch und bekomme die Ausgaben ja auf der Website angezeigt..

Vielen Dank für deine grossartige Hilfe
Kebab
 

timmy38233

Rhode Island Greening
Registriert
20.07.08
Beiträge
474
Der Query-String sieht erstmal richtig aus. MySQL gibt auch keinen Fehler zurück.

Dennoch wird ein leeres Ergebnis zurückgegeben. Das heißt, das MySQL in der Tabelle users keinen Eintrag findet wo username und password gleich 'asdf' ist.

Du schriebst, dass die Registrierung perfekt läuft. Woher weißt Du das? (Also wie prüfst Du, dass Benutzer wirklich angelegt und in der Datenbank gespeichert werden? Mit phpMyAdmin?)
 

Kebab

Boskoop
Registriert
22.02.15
Beiträge
39
Hallo zusammen

Könnte das Problem sein das, dass Passwort mit md5 verschlüsselt ist?
Also ich nehme schwer an das die Registrierung funktioniert, denn ich bekomme alle einen Eintrag in der DB.
@timmy38233 Ja ich schaue in der phpMyAdmin 3 DB nach ich habe einen Screenshot von dem Eintrag gemacht.
@DubiDuh Ja, das hat timmy schon erwähnt, sobald ich das Problem gelöst habe widme ich mich der Sicherheit und werde dann deine Links gerne durchschauen. Danke für deine Hilfe. Hahahah der Name erinnert mich an einen alten Mann der mich mal angesprochen hat und fragte ob ich im eine Heft namens Dubi Duh im Kiosk hole, da es für Kinder gratis sei und er mir dann einen Schokokeks für die Schule abkauft. Ich habe dann aber an der Aussprache bemerkt das er Du bist dumm sagte:D guter Name gefällt mir!

Vielen Dank für eure Hilfe
 

Anhänge

  • Admin.PNG
    Admin.PNG
    12,2 KB · Aufrufe: 90

DubiDuh

Zwiebelapfel
Registriert
20.05.08
Beiträge
1.288
Das Passwort liegt bereits als Hash in der Datenbank. Ich vermute, dass du md5 oder sha in deiner Registrierung verwendest. Daher muss die Abfrage auch diese Hashfunktion aufrufen:

PHP:
$check_password = mysql_query("SELECT password FROM users WHERE password='" . md5($password)."' && username='$username'");
 

Kebab

Boskoop
Registriert
22.02.15
Beiträge
39
Vielen Dank habe ich gemacht, aber ich bekomme immer noch "SELECT password FROM users WHERE password='asdf' && username='asdf'" bool(false) 0: das zurück. Hier ist noch der Registrierungscode:
Vlt hilf der weiter...:rolleyes:
Neuer Logincode:
PHP:
<?php
include ( './includes/header.php' );


if (isset($_POST['username'])&&(isset($_POST['password']))) {
  $username = strip_tags($_POST['username']);
  $password = strip_tags($_POST['password']);
  echo $username;
$check_username = mysql_query("SELECT username FROM users WHERE username='$username'");
$numrows = mysql_num_rows($check_username);
if ($numrows != 1) {
  echo 'That User doesn\'t exist.';
}
else
{
  var_dump("SELECT password FROM users WHERE password='$password' && username='$username'");
  //$check_password = mysql_query("SELECT password FROM users WHERE password='$password' && username='$username'");
  $check_password = mysql_query("SELECT password FROM users WHERE password='" . md5($password)."' && username='$username'");
  $assoc = mysql_fetch_assoc($check_password);
  var_dump($assoc);
  echo mysql_errno() . ": " . mysql_error(). "\n";
  while ($row = mysql_fetch_assoc($check_password)) {
   $password_db = $row['password'];
  
  
   if ($password_db == $password) {
     $_SESSION['username'] = $username;
    
    //header("Location: members.php");
   }
  }
}
}

Register:
PHP:
<?php
include ( './includes/header.php' );
$error = "";
if (@$_POST['register']) {
$firstname = strip_tags($_POST['firstname']);
$lastname = strip_tags($_POST['lastname']);
$username = strip_tags($_POST['username']);
$email = strip_tags($_POST['email']);
$password1 = strip_tags($_POST['password']);
$password2 = strip_tags($_POST['passwordrepeat']);
$day = strip_tags($_POST['day']);
$month = strip_tags($_POST['month']);
$year = strip_tags($_POST['year']);
$dob = "$day/$month/$year";
if ($firstname == "") {
  $error = "Firstname cannot be left empty.";
}
else if ($lastname == "") {
  $error = "Lastname cannot be left empty.";
}
else if ($username == "") {
  $error = "Username cannot be left empty.";
}
else if ($email == "") {
  $error = "Email cannot be left empty.";
}
else if ($password1 == "") {
  $error = "Password cannot be left empty.";
}
else if ($password2 == "") {
  $error = "Repeat Password cannot be left empty.";
}
else if ($day == "") {
  $error = "The day you were born cannot be left empty.";
}
else if ($month == "") {
  $error = "The month you were born cannot be left empty.";
}
else if ($year == "") {
  $error = "The year you were born cannot be left empty.";
}
//Check the username doesn't already exist
$check_username = mysql_query("SELECT username FROM users WHERE username='$username'");
$numrows_username = mysql_num_rows($check_username);
if ($numrows_username != 0) {
  $error = 'That username has already been registered.';
}
else
{
  $check_email = mysql_query("SELECT email FROM users WHERE email='$email'");
$numrows_email = mysql_num_rows($check_email);
if ($numrows_email != 0) {
  $error = 'That email has already been registered.';
}
else
{
   $salt1 = "francis";
   $salt1 = md5($salt1);
   $salt2 = "cookie";
   $salt2 = md5($salt2);
   $salt3 = "php";
   $salt3 = md5($salt3);
   $password1 = $salt1.$password1.$salt3;
   $password1 = md5($password1.$salt2);
   $password2 = $salt1.$password2.$salt3;
   $password2 = md5($password2.$salt2);
if ($password1 != $password2) {
$error = 'The passwords don\'t match!';
}
else
{
//Register the user
$register = mysql_query("INSERT INTO users VALUES('','$firstname','$lastname','$username','$email','$password1','$dob','no')");
die('Regsitered successfully!');
}
}
}
}
?>
<h2>Create Your Account</h2>
<form action='join.php' method='POST'>
<input type='text' name='firstname' value='Firstname ...' onclick='value=""'/><p />
<input type='text' name='lastname' value='Lastname ...' onclick='value=""'/><p />
<input type='text' name='username' value='Username ...' onclick='value=""'/><p />
<input type='text' name='email' value='Email ...' onclick='value=""'/><p />
<input type='text' name='password' value='Password ...' onclick='value=""'/><p />
<input type='text' name='passwordrepeat' value='Repeat Password ...' onclick='value=""'/><p />
<input type='text' name='day' value='' size='3' maxlength='2' onclick='value=""'/>
<input type='text' name='month' value='' size='6' maxlength='2' onclick='value=""'/>
<input type='text' name='year' value='' size='4' maxlength='4' onclick='value=""'/><p />

<input type='submit' name='register' value='Create Your Account' />
<?php echo $error; ?>
</form>