[PHP] Login mit PHP und MySQL

Am besten liest du dir mal ein paar Tutorials über Sessions durch.
Ich hab hier eins gefunden, das sich mit der Thematik "Login mit PHP und mySQL" beschäftigt.
Hier hab ich nochwas gefunden.
 
Zuletzt bearbeitet:
Guten Morgen,

ich hab mich nun etwas bezüglich des der unterschiedlichen Hash-Strings umgeschaut.
In deinem obigen String wird die Differenz durch das Paragrafenzeichen ausgelöst.
Ein "SELECT MD5( '§' )" bringt führt auf dem einem Server zu einer Ausgabe von "bd9a4c255deec8944d99e01a64c1e322" während selbige SELECT-Abfrage auf dem anderem Server "6b2b98fea11e51af3043b192f719bd69" liefert.
Auch der SHA-Hash unterscheidet sich dabei und ist auf dem einem Server "eb2cb244889599f736b6cdd633c5e324f521d1bb" während er auf dem anderem zu "cf5bf6c63ba8e32483f75660b3a6a0f5d764483" führt.
Eine SOUNDEX-Abfrage führt ebenfalls zu Differenzen.
Nun ein paar Versuchen auf anderen Servern bin ich dann darauf gekommen, dass dies mit der Zeichensatz-Kodierung, die der Server verwendet, zusammenhängen wird.
Dies scheint auch tatsächlich das Problem zu sein.

Somit ist es in der Tat wichtig, dass man, sofern es Differenzen in den verwendeten Zeichensätzen gibt, nur eine der beiden Varianten einszusetzen um so Probleme zu vermeiden.
Hierbei würde ich ebenfalls dann zur PHP-Funktion raten, da diese auch datenbankunabhängig eingesetzt werden kann.

MfG mh1001
 
Hab mir mal die beide tuts durchgelesen....hab soweit alles verstenaden nur wenn ich überprüfen will ob jmd eingeloggt ist oder nicht, muss ich da auch am anfang der page session_start() ausführen?
Wenn man das machen müsste fände ich das ziemlich unlogisch da ja bei session_start eine id zugewiesen wird, und wenn ich die id dann unten überprüfe wäre das ja absolut sinnlos.......

MFG

TeWeS
 
Ja, genau so ist es aber. Immer wenn du mit Sessions arbeiten möchtest, musst du die Funktion session_start() aufrufen.
Diese Funktion erstellt eine neue Session oder nimmt eine bestehende wieder auf.
Ob ein Benutzer angemeldet ist oder nicht kannst du dann in der Session hinterlegen.
Auf die Sessions kannst du dann wie auf eine normales Array zugreifen.
So kannst du beim erfolgreichen Anmelden beispielsweise folgendes in das Session-Array schreiben:
PHP:
$_SESSION["login"] = 1;
Nun brauchst du lediglich immer überprüfen ob dieser Wert auf "1" gesetzt ist und kannst so den Login-Status überprüfen.
Also Beispielsweise so:
PHP:
<?php
session_start();

if($_SESSION["login"] == 1)
{
  // mache dies und das
}
?>
MfG mh1001
 
achso...jetzt hab ich es verstanden

thx

//edit:
Nochmal kurz eine Frage zu session....wenn ich jetzt einem user die session id = 1 zuweise und ein zweiter user kommt auf die seite, kann es dann nicht passieren das die user vertauscht werden da sie ja beide die id 1 haben.....
 
Zuletzt bearbeitet:
Wie meinst du das? Die Session-ID wird vom Server generiert, wobei du in der Regel nicht mit diesem Vorgang direkt in Verbindung kommst. ;)
Eine Anfälligkeit gegen Fehler ist sehr gering und nahezu auszuschließen.
Die Daten die du innerhalb einer Session speicherst sind dagegen vollkommen losgelöst davon und werden serverseitig verwaltet und den entsprechenden Session-IDs zugeordnet.

MfG mh1001
 
So kannst du beim erfolgreichen Anmelden beispielsweise folgendes in das Session-Array schreiben:
PHP:
$_SESSION["login"] = 1;
Nun brauchst du lediglich immer überprüfen ob dieser Wert auf "1" gesetzt ist und kannst so den Login-Status überprüfen.
Also Beispielsweise so:
PHP:
<?php
session_start();

if($_SESSION["login"] == 1)
{
  // mache dies und das
}
?>

wenn ich das aber so mache....dann wird doch jeder user auf 1 gesetzt.
oder soll ich die id aus der SQL datenbank nehmen....weil die is ja eindeutig....
 
So war das wohl nicht gemeint.
Du generierst beim Login eine Sessioid, die ziemlich einzigartig für den einen User ist. Zum Beispiel aus dem Namen des Users, seinem Passwort und dem jetzigen Monat. So wäre zudem gewährleistet, dass diese SessionID zeitlich begrenzt ist.
PHP:
$_SESSION["login"] = md5($passwort.$name.$monat);

Oder natürlich du speicherst für jeden User die ID direkt in der Datenbank. Das ginge wohl auch, ist aber nicht ganz SO sicher. Wobei das beim Hobbyprogrammieren wohl recht egal sein sollte.

mfg
 
k wollt das jetzt über die db id machen....nur jetzt gibt er mir, wenn ich auf der login page bin aus das meine id 5 ist und wenn ich auf die nächste seite gehe, sagt er mir das meine id 4 ist, woran könnte das liegen??
Um die id rauszubekommen habe ich die zeile benutzt
PHP:
$id = mysql_query("SELECT id FROM member WHERE nick='".maskieren($_POST['username'])."'");
MFG

//edit: es existiert nochnichmal ein user mit der id 4 || 5.
Es gitb nur 32, 6 und 3(auch in der reihenfolge :confused_alt:
 
Zuletzt bearbeitet:
Da ich gestern nicht mehr Zeit hatte, konnte ich das leider nur so kurz erklären. Hier nochmals etwas anders ausgedrückt:

Wenn zwischen dem Server und einem Clienten eine Verbindung aufgebaut wird und session_start() aufgerufen wird, so generiert der Server eine Session-ID. Diese ID ist unter normalen Umständen einzigartig.
Nun kannst du in das Session-Array ($_SESSION) Daten schreiben. Diese Session-Daten werden dann nicht für sämtliche Clienten übernommen, sondern werden mit der vom Server generierten Session-ID verknüpft. Diese Session-ID nutzt ebenfalls der Browser des Clienten zur Indentifikation am Server. Ein weiterer Client hat dagegen auch eine andere Session-ID, wobei auch seine Session-Daten völlig unabhängig von denen der anderen Benutzer verwaltet werden.
Wenn du jetzt in das Session-Array zum Beispiel folgendes schreibst "$_SESSION["login"] = 1;" dann ist dies nicht generell für jeden Benutzer gesetzt, sondern lediglich für den entsprechenden Benutzer hinterlegt (sprich es wird seiner Session zugeordnet).
Daneben haben PHP-Sessions standardmäßig eine Laufzeit von 2h. Wenn in dieser Zeit keine weiteren Transaktionen aufrtreten werden die Session-Daten auf dem Server gelöscht. Diese Verfallszeit kann aber in der PHP-Konfigurationsdatei geändert werden.

MfG mh1001
 
Zuletzt bearbeitet:
@md5-Problem:
Nachdem ich die neue XAMPP Version 1.5.1 (mit mySQL 5.0.18) gleich installiert habe und den Zeichensatz auf "latin7_bin" gestellt habe, bekomme ich für das Paragraphenzeichen den selben md5-Wert sowohl mit der PHP als auch mit der mySQL-Funktion.
Sowohl...
PHP:
<?php echo md5("§"); ?>
...als auch...
Code:
SELECT MD5('§')
führen zum selben Ergebnis: 6b2b98fea11e51af3043b192f719bd69
 
das ist kein problem das ist so richtig weil md5 einstandert ist sprich es muss immer das gleiche raus kommen ...
 
Wenn das so wäre, dann hätte ich mir nicht stundenlang den Kopf zerbrochen ;)
Es kommt auf den Zeichensatz an. mh1001 hat dieses Problem bestätigt.
 
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;
}

Das könnte man auch etwas eindampfen zu

PHP:
function maskieren($string)
{
  return (get_magic_quotes_gpc()) ? $string : addslashes($string);
}

function demaskieren($string)
{
  return (get_magic_quotes_gpc()) ? stripslashes($string) : $string;
}

Die andere Methode empfiehlt sich aber eher, dann spart man sich z.B. das ständige manuelle "demaskieren".

PHP:
$SQL = "INSERT INTO member (nick, passwort, email, name, nachname, ort, anmeldung) VALUES ('".$_REQUEST['nick']."', '".md5($_REQUEST['passwort'])."', '".$_REQUEST['mail']."', '".$_REQUEST['name']."', '".$_REQUEST['nname']."', '".$_REQUEST['ort']."', NOW())";

Auch hier sollten alle REQUEST-Variablen unbedingt "maskiert" werden.
 
@Floele

Da hast du natürlich Recht, so könnte man etwas Platz sparen. Nur mir persönlich gefällt diese Schreibweise nicht so sehr. Dies ist aber Ansichtssache - vom Resultat und performancemäßig kommt bei beidem das selbe heraus. ;)

Das mit dem Request-Variablen verstehe ich aber nicht so ganz.
Worin liegt in deinem Beispiel der Vorteil im Gegensatz zu dem Zugriff auf das $_POST- oder $_GET-Array? ;)
Entsprechend maskiert müssen diese ebefalls alle werden.
(Fast alle, das Passwort sollte nicht maskiert werden, da es sonst zu Verfäschungen der MD5-Prüfsumme kommen kann. ;) )

MfG mh1001
 
Zuletzt bearbeitet:
mh1001 schrieb:
und performancemäßig kommt bei beidem das selbe heraus. ;)

Sicher, da tut sich nicht viel, aber in meiner Version wird jedenfalls keine unnötige Variable gebraucht.

Das mit dem Request-Variablen verstehe ich aber nicht so ganz.
Worin liegt in deinem Beispiel der Vorteil im Gegensatz zu dem Zugriff auf das $_POST- oder $_GET-Array? ;)

War doch nicht meine Idee. REQUEST ist stellvertretend für GET und POST, dh. bei Request spielt es keine Rolle ob man Daten per POST oder GET Methode überträgt.

(Fast alle, das Passwort sollte nicht maskiert werden, da es sonst zu Verfäschungen der MD5-Prüfsumme kommen kann. ;) )

Kann es eigentlich nicht. Unter welchem Umständen sollte das deiner Meinung nach passieren?
 
Moin

weiss jetzt jmd woran das liegen könnte das ich unterschiedliche ids rausbekomme obwohl ich immer das gleiche verfahren anwende und nichtmal user mit der id 4 oder 5 in meiner Datenbank habe?

MFG

TeWeS
 
@tewes

Wie sieht denn nun dein Code aus? Eigentlich dürfte dies nicht sein. ;)

@Floele

Sicher, da tut sich nicht viel, aber in meiner Version wird jedenfalls keine unnötige Variable gebraucht.
Da gebe ich dir natürlich Recht. ;)

War doch nicht meine Idee. REQUEST ist stellvertretend für GET und POST, dh. bei Request spielt es keine Rolle ob man Daten per POST oder GET Methode überträgt.
Sorry, hatte gedacht, dass der Code von dir kommt und schon vergeblich nach einem Unterschied bezüglich der Thematik des Maskierens gesucht. ;)

Kann es eigentlich nicht. Unter welchem Umständen sollte das deiner Meinung nach passieren?
Wenn du zum Beispiel ein Passwort mit einem Steuerzeichen als POST-oder GET-Variable übergibst ändert sich somit durch das/die Escape-Zeichen der String und somit auch dessen Prüfsumme.
Wenn du allerdings erst die Prüfsumme maskierst ändert dies natürlich nichts.
In dem Fall ist dies aber dennoch überflüssig, da ein MD5-Hash keine entsprechenden Zeichen enthält.

MfG mh1001
 
Zuletzt bearbeitet:
Login-Page:
PHP:
<?php
session_start();
?>
.....
<?php
include 'function.php';
$DatabasePointer = mysql_connect("127.0.0.1", "" , "");
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);
$id = mysql_query("SELECT id FROM member WHERE nick='".maskieren($_REQUEST['username'])."'");

if ( (mysql_num_rows($sql_query) != 0) && (md5($passwort) ==  $row['passwort']) ) 
    {   
	    echo "Willkommen, $username!";
		echo "<br />";
		echo$id;
		$_SESSION["ID"] = $id;
		?>
		<br />
		<a href="31.php">31</a>
		<?php
		 
    }
else 
    {
        echo"Der User und/oder das Passwort wurden nicht gefunden!";
    }
?>
Zu schützende seite
PHP:
<?php
session_start();
include 'function.php';
$DatabasePointer = mysql_connect("127.0.0.1", "" , "");
mysql_select_db("tewes_01", $DatabasePointer);
$id = mysql_query("SELECT id FROM member WHERE nick='".maskieren($_REQUEST['username'])."'");
echo$id;
if($_SESSION["ID"] != $id)
{
	echo "Sie haben keine Berechtigung diesen bereich zu sehen";
}
else
{
?>
<html>
<head>
 
Zurück
Oben