 |
| Hinweise |
Willkommen im TP-Hilfe-Forum!Dies ist ein Forum zu den Themen Photoshop, Dreamweaver, Flash, Selbständigkeit und mehr, in dem Du Hilfe, Anleitung oder eine Lösung zu Deinen Problemen erhältst. Aktuell bist Du in unseren Foren als Gast mit reinen Leserechten unterwegs. Wenn Du Dich registrierst, kannst Du eigene Themen verfassen, Deine Frage stellen und privat mit anderen TPlern kommunizieren. Weitere Foren werden zugänglich, und Du wirst – falls gewünscht – per Mail über neue Beiträge informiert. Die Registrierung ist schnell und kostenlos. Sollten bei der Registrierung Fragen auftauchen, reicht ein Klick in unsere Hilfe - Häufig gestellte Fragen oder eine kurze Mitteilung an das Support-Team. Viel Spaß bei Traum-Projekt.com |
08.04.2008, 21:09
|
#1
|
|
TP-Supporter
Registriert seit: Feb 2005
Ort: Braunschweig
|
Problem mit Login
Hallo zusammen,
ich habe eine Website konzipiert, die geschützte Seiten beinhaltet. Um diese Seiten sehen zu können, muss man sich daher zunächst einloggen.
Die von mir altbewährte Methode ist diese:
login.php:
PHP-Code:
session_start();
$user = $_REQUEST['user'];
$_SESSION['user'] = $_REQUEST['user'];
session_register("ses_user");
$ses_user = $_SESSION['user'];
Auf allen anderen Seiten schleppe ich den Benutzernamen dann so mit:
PHP-Code:
session_start();
session_register("ses_user");
$ses_user = $_SESSION['user'];
Das Komische ist, dass es immer funktioniert hat. Und seit zwei Tagen - ohne dass ich was dran gemacht habe - läuft das Ganze nach dem Zufallsprinzip. Der User wird nicht mehr konsequent übergeben, und hier und da fliegt man dann mal raus.
Ich habe auf jeder Seite mal echo $ses_user angegeben. Wenn ich dann beispielsweise auf "Kontakt" klicke, ist der user plötzlich weg, beim nächsten Klick ist er wieder da, dann wieder weg. Manchmal kann ich auch 20 mal hintereinander klicken, und es läuft ganz normal. Beim nächsten Versuch fliegt man nach jedem zweiten Klick raus.
Lange Rede, kurzer Sinn: Woran kann das liegen?
__________________
Gruß, Nadine
|
|
|
08.04.2008, 22:23
|
#2
|
|
TP-Moderator
Registriert seit: Jun 2004
Ort: Hannover
|
Äh.. warum würfelst du den User zwischen den Variablen hin und her?
ein einfaches
PHP-Code:
$_SESSION['ses_user'] = $_REQUEST['user'];
und dann konsequent weiter mit dem globalen Array $_SESSION arbeiten, reicht doch völlig aus.
__________________
Je größer der Deppenfaktor, desto gigantischer das Bescheidwissergefühl
-Dieter Nuhr
|
|
|
08.04.2008, 22:37
|
#3
|
|
TP-Supporter
Registriert seit: Feb 2005
Ort: Braunschweig
|
Das mache ich ja auch nur in der login.php, um zu bestimmen, welcher Wert übergeben werden muss.
Es wird ja dann auf den Folgeseiten abgefragt, ob der user vorhanden ist und er gesperrte Seiten auch zur Verfügung hat.
Ich habe jetzt aber session_register() rausgenommen. Da reicht $_SESSION dann wirklich aus. Ich weiß auch gar nicht, warum ich beides drin hab.
Momentan funktioniert es (wieder mal)... Ich bin mir aber nicht sicher, ob es das wirklich war.
__________________
Gruß, Nadine
|
|
|
08.04.2008, 23:35
|
#4
|
|
TP-Supporter
Registriert seit: Feb 2005
Ort: Braunschweig
|
War es offenbar nicht, da es immer noch nicht funktioniert...
__________________
Gruß, Nadine
|
|
|
11.04.2008, 11:40
|
#5
|
|
TP-Supporter
Registriert seit: Feb 2005
Ort: Braunschweig
|
Ich muss hier doch nochmal was zu schreiben.
Ich habe jetzt mein Login-Skript verändert und bin durch Recherchen auch auf das von Karl Förster gekommen.
Bei mir siehts nun also so aus:
login.php
PHP-Code:
$login_query = "SELECT user, pass FROM t_member WHERE user like '".$user."' AND pass like '".$pass."'";
$login_res = mysql_query($login_query);
if (mysql_num_rows ($login_res) > 0)
{
// Benutzerdaten in ein Array auslesen.
$data = mysql_fetch_array ($login_res);
// Sessionvariablen erstellen und registrieren
$_SESSION["user"] = $data["user"];
$_SESSION["pass"] = $data["pass"];
header ("Location: willkommen.php");
}
else
{
$thiserrormsg .= "Deine Benutzerdaten sind leider nicht korrekt.";
}
Und die geschützten Seiten sehen beispielsweise so aus:
PHP-Code:
if (!isset ($_SESSION["user"]))
{
$template = "templates/error.tpl.php";
}
else
$template = "templates/willkommen.tpl.php";
Nun gibt es natürlich noch Seiten, die für alle frei zugänglich sind. Da habe ich dann gar nichts weiter eingebunden.
Trotzdem ist es so, dass man teilweise immer noch rausfliegt. Das macht für mich überhaupt keinen Sinn. Man fliegt auch gar nicht immer raus, sondern es sieht nur so aus.
Ich gehe auf eine geschützte Seite - obwohl ich angemeldet bin - und dann kommt meine errror.php "Du musst angemeldet sein...", dann klicke ich einfach weiter, und meine Benutzerdaten sind wieder da, obwohl ich mich gar nicht neu angemeldet habe.
Kann das vielleicht irgendwie was mit den STrato-Einstellungen zu tun haben?
Vielleicht ist auf folgendes noch interessant:
Ich habe eine Box mit integriert, die den aktuellen Status (an- oder abgemeldet) anzeigt:
PHP-Code:
if(isset($_SESSION["user"]))
{
echo 'Angemeldet als<br>
<br>'.$_SESSION["user"].'<br> <br>
<a href="meine_daten.php">> Meine Daten</a><br> <br>
<a href="logout.php">> Abmelden</a>';
}
else echo '
Status: abgemeldet<br> <br>
<a href="login.php">> Anmelden</a><br> <br>
<em>Noch nicht <a href="register.php">registriert</a>?<br>
<a href="sendpass.php">Passwort</a> vergessen?</em>';
Ich habe mich schon gefragt, ob das vielleicht irgendwie kollidiert, kann mir aber auch nicht vorstellen, warum das so sein sollte.
__________________
Gruß, Nadine
|
|
|
11.04.2008, 11:47
|
#6
|
|
TP-Urgestein
Registriert seit: Nov 2003
Ort: NRW
|
Hast Du auch auf allen Seiten ein session_start(); drin?
Leider kann man bei den Codefragmenten nichts genaues erkennen ...
|
|
|
11.04.2008, 11:53
|
#7
|
|
TP-Supporter
Registriert seit: Feb 2005
Ort: Braunschweig
|
Habe ich definitiv. Das Komische ist ja eben auch, dass es immer lief, und von heute auf morgen kamen die Probleme. Und wenn ich die nicht langsam in den Griff bekomme, stehe ich auch echt dumm da...
Ich arbeite auch auf allen Seiten mit dem gleichen Code und habe nirgends ein Problem. Deswegen habe ich an Strato gedacht?
Eben war es z. B. wieder so, dass ich auf eine geschützte Seite geklickt habe und wieder eine Fehlermeldung kam. Dann ich habe ich direkt danach wieder drauf geklickt, und es hat geklappt.
Das macht einfach keinen Sinn.
__________________
Gruß, Nadine
|
|
|
11.04.2008, 12:12
|
#8
|
|
TP-Moderator
Registriert seit: Aug 2004
Ort: Kaiserslautern
|
Hallo buffy2511,
dann kontaktiere eben mal den Support von Strato und frag nach ob die was geändert haben. (evtl. neue PHP Version)
Die Lebzeit einer Session kann man über die Serverkonfiguration steuern, von daher ist es im Bereich des Möglichen, dass es an Strato liegt.
__________________
#.Viele Grüße, Andreas
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
|
|
11.04.2008, 12:21
|
#9
|
|
TP-Moderator
Registriert seit: Jun 2004
Ort: Hannover
|
Ich würde mir das mal sehr gut mit dem Loginscript noch gut überlegen.. Sicher kommt mir das nämlich nicht vor..
__________________
Je größer der Deppenfaktor, desto gigantischer das Bescheidwissergefühl
-Dieter Nuhr
|
|
|
11.04.2008, 12:23
|
#10
|
|
TP-Supporter
Registriert seit: Feb 2005
Ort: Braunschweig
|
Das hatte ich gleich zu Anfang auch gemacht. Die meinten aber, sie hätten nichts geändert.
Parallel dazu habe ich die Site aber mal auf meinen Server hochgeladen, und da bin ich noch nicht einmal rausgeflogen (bei Variomedia).
__________________
Gruß, Nadine
|
|
|
11.04.2008, 12:24
|
#11
|
|
TP-Supporter
Registriert seit: Feb 2005
Ort: Braunschweig
|
Zitat:
Zitat von Adromir
Ich würde mir das mal sehr gut mit dem Loginscript noch gut überlegen.. Sicher kommt mir das nämlich nicht vor..
|
Warum? Wie würdest Du es machen?
__________________
Gruß, Nadine
|
|
|
11.04.2008, 12:50
|
#12
|
|
TP-Supporter
Registriert seit: Feb 2005
Ort: Braunschweig
|
Der Typ von Strato hat eben gesagt, ich könne Abhilfe schaffen, in dem ich die Sessions auslagere und eine eigene php.ini anlege.
Jetzt habe ich aber doch etwas Angst, da was falsch zu machen. Welche Werte müsste ich denn anpassen?
__________________
Gruß, Nadine
|
|
|
11.04.2008, 19:55
|
#13
|
|
TP-Moderator
Registriert seit: Feb 2003
Ort: Erfurt
|
Zur Sicherheit, was Dein Formular betrifft. Adromir hat das schon richtig erkannt. Hier sind eklatante Fehler drinne.
1.
verwende niemals $_REQUEST für die Übergabe aus einem Login Formular. $_REQUEST verarbeitet auch $_GET-Parameter, damit ist das erste Tor offen.
2.
Zitat:
|
$login_query = "SELECT user, pass FROM t_member WHERE user like '".$user."' AND pass like '".$pass."'";
|
Verwende niemals LIKE, wenn du etwas eindeutiges, hier User und Passwort ermitteln willst.
Deine Abfrage gibt nämlich einen Treffer für jeden User, der z.B. ein "s" im Usernamen und ein "a" im Passwort hat.
3. Warum ist das so? Weil du auch noch für dieses Ergebnis alle in der DB enthaltenen Werte als richtig ausgibts, nämlich mit
PHP-Code:
if (mysql_num_rows ($login_res) > 0)
Du fragst, ob dein query größer 0 ist, dass können dann ja auch 100 Ergebnisse sein. Wenn Ich also in Dein Formular bei user ein "s" und bei Passwort ein "a" eingebe, und es 100 Datensätze gibt, die diese Komnination enthalten, so habe ich mit dem 100ten Namen aus deinem Query Zugang zu den geschüzten Bereichen.
Besser wäre hier ein
PHP-Code:
if (mysql_num_rows($login_res)==1)
Es darf ja immer nur ein Treffer Richtig sein.
Auch solltest du unbeding deine Varibalen auf die wichtigsten Gefahre hin überprüfen, bevor du Sie an Deine DB sendest.
SQL-Injection sind hier ein Kinderspiel. Verwende trim(), stripslashes(), bzw.
get_magic_quotes_gpc und mysql_real_escape_string(). Dann hast Du schon viel für die Sicherheit getan
__________________
Schöne Grüße aus Thüringen
Stephan Page
Stell Dir vor, hier steht was und keiner liest es!! schon entdeckt?? F1 ist ne geile Taste
Ich beantworte keine E-Mails. Bitte alle Fragen ins Forum
schon gehört??? Das Internet ist voll, die lassen keinen mehr rein!!
|
|
|
11.04.2008, 20:47
|
#14
|
|
TP-Moderator
Registriert seit: Feb 2003
Ort: Erfurt
|
Hier mal ein Beispiel für ein User-Login und Logout
PHP-Code:
<?
//Abfrage, ob Login-Button geklickt wurde
if(isset($_POST['loginbutton_x'])){
// Maskierende Slashes aus POST entfernen
$_POST = get_magic_quotes_gpc() ? array_map( 'stripslashes', $_POST ) : $_POST;
//Leerzeichen entfernen
$_POST['username'] = trim($_POST['username']);
$_POST['passwort'] = trim($_POST['passwort']);
//Wenn nach der Leerzeichenentferung noch was drinne steht
if(!empty($_POST['username']) || !empty($_POST['passwort'])){
//dann der Variablen $userid die Rückgabe der Funktion check_user übergeben
$userid=check_user($_POST['username'], $_POST['passwort']);
//Mit dieser Userid wird dann die Funktion login durchgeführt
login($userid);
}
}
//Wenn der Logout-Button geklickt wurde
if(isset($_POST['logoutbutton_x'])){
//die Funktion für das Ausloggen durchführen
logout();
}
//Die Eingaben aus dem Formular überprüfen,
function check_user($name, $pass)
{
//ob es diesen User wirklich gibt,
//dass Passwort liegt mit einem md5 String in der Datenbank
$sql="SELECT id FROM ".Tab1."
WHERE username='".mysql_real_escape_string($name)."'
AND passwort=MD5('".mysql_real_escape_string($pass)."')
LIMIT 1";
$result= @mysql_query($sql);
//Gibt es wirklich 1 Treffer
if (mysql_num_rows($result)==1)
{
$user=mysql_fetch_assoc($result);
//dann Wird die userID für die funktion login() zurückgegeben
return $user['id'];
}
else {
//Ansonsten irgendwas zurückgeben
global $loginFehler;
$loginFehler = "Unbekannter User!";
//echo $loginFehler;
return false;
}
}
//Nun mit der ermittelten userid den Login durchführen
//und den Datensatz des User in der DB aktualisieren
function login($userid) {
//echo "<br>\$userid = ".$userid;
//Damit passende Zugangsdaten zeitgleich immer nur von einem Rechner
//und einem Browserfenster aus ausführbar sind, und nicht von
//mehreren Rechnern aus gleichzeitig verwendet werden können,
// werden IP-Adresse und Session aktualisiert.
$sql="UPDATE ".Tab1." SET
usersession=MD5('".session_id()."'),
ipadresse='".$_SERVER['REMOTE_ADDR']."',
geaendert=NOW()
WHERE id=".$userid;
//
if(@mysql_query($sql)){
$sql="SELECT id, username, usersession FROM ".Tab1." WHERE id=".$userid;
$result= @mysql_query($sql);
if (@mysql_num_rows($result)==1)
{
$user=mysql_fetch_assoc($result);
//Benötigte werte in Sessions Speichern
//Oder sonst was machen
$_SESSION['user_id'] = $user['id'];
$_SESSION['user_name'] = $user['username'];
$_SESSION['user_session'] = $user['usersession'];
}
else {
//Ansonsten gibts False zurück, und der Login ist gescheitert
return false;
}
}
}
//Nun die Funktion zum Überprüfen, ob der Sitebesucher eingeloggt ist,
//und den Inhalt sehen darf
function logged_in()
{
$sql="SELECT id, username, usersession, ipadresse FROM ".Tab1."
WHERE id='".$_SESSION['user_id']."'
AND username='".$_SESSION['user_name']."'
AND usersession='".$_SESSION['user_session']."'
AND ipadresse='".$_SERVER['REMOTE_ADDR']."'
LIMIT 1";
$result= @mysql_query($sql);
if(@mysql_num_rows($result)==1){
global $loginErfolg;
$loginErfolg = "Eingeloggt als<br>".$_SESSION['user_name'];
return ( mysql_num_rows($result)==1);
}
}
//Die funktion zum Ausloggen
function logout()
{
//Session und IP-Adresse werden wieder gelöscht
$sql="UPDATE ".Tab1." SET
usersession=NULL,
ipadresse=NULL
WHERE usersession=MD5('".session_id()."') ";
@mysql_query($sql);
//Alle Session Variablen zerstören und löschen
$_SESSION = array();
session_unset();
session_destroy();
}
//
//Dies ist der Aufruf. Einfach in den Betreffenden
//Seiten einsetzen, wo eine Userüberprüfung stattfinden soll.
if(logged_in()){
//Mach irgendwas
echo "Glückwunsch, Du bist drinne";
//Weitere PHP oder HTML-Ausgaben
}
else{
echo "Was guckst Du, Du kommst hier net rein!";
}
?>
__________________
Schöne Grüße aus Thüringen
Stephan Page
Stell Dir vor, hier steht was und keiner liest es!! schon entdeckt?? F1 ist ne geile Taste
Ich beantworte keine E-Mails. Bitte alle Fragen ins Forum
schon gehört??? Das Internet ist voll, die lassen keinen mehr rein!!  | | |