mysqldumper
-


Hinweise


Antwort
 
LinkBack Themen-Optionen Thema durchsuchen Thema bewerten
Alt 08.04.2008, 21:09   #1
TP-Supporter
 
Benutzerbild von buffy2511
 
Registriert seit: Feb 2005
Ort: Braunschweig
buffy2511 macht alles soweit korrekt

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
buffy2511 ist offline   Mit Zitat antworten


Alt 08.04.2008, 22:23   #2
TP-Moderator
 
Benutzerbild von Adromir
 
Registriert seit: Jun 2004
Ort: Hannover
Adromir lebt für das TP und seine UserAdromir lebt für das TP und seine UserAdromir lebt für das TP und seine UserAdromir lebt für das TP und seine UserAdromir lebt für das TP und seine UserAdromir lebt für das TP und seine User
Ä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
Adromir ist offline   Mit Zitat antworten
Alt 08.04.2008, 22:37   #3
TP-Supporter
 
Benutzerbild von buffy2511
 
Registriert seit: Feb 2005
Ort: Braunschweig
buffy2511 macht alles soweit korrekt
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
buffy2511 ist offline   Mit Zitat antworten
Alt 08.04.2008, 23:35   #4
TP-Supporter
 
Benutzerbild von buffy2511
 
Registriert seit: Feb 2005
Ort: Braunschweig
buffy2511 macht alles soweit korrekt
War es offenbar nicht, da es immer noch nicht funktioniert...
__________________
Gruß, Nadine
buffy2511 ist offline   Mit Zitat antworten
Alt 11.04.2008, 11:40   #5
TP-Supporter
 
Benutzerbild von buffy2511
 
Registriert seit: Feb 2005
Ort: Braunschweig
buffy2511 macht alles soweit korrekt
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>&nbsp;
          <br>'
.$_SESSION["user"].'<br>&nbsp;<br>
          <a href="meine_daten.php">> Meine Daten</a><br>&nbsp;<br>
          <a href="logout.php">> Abmelden</a>'
;
}

else echo 
'
Status: abgemeldet<br>&nbsp;<br>
<a href="login.php">&gt; Anmelden</a><br>&nbsp;<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
buffy2511 ist offline   Mit Zitat antworten
Alt 11.04.2008, 11:47   #6
TP-Urgestein
 
Benutzerbild von webcreate
 
Registriert seit: Nov 2003
Ort: NRW
webcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichts
Hast Du auch auf allen Seiten ein session_start(); drin?
Leider kann man bei den Codefragmenten nichts genaues erkennen ...
__________________
Gruß Mark
Mein Blog zum TP || XING Profil || grafiker.de Profil || How to use GOOGLE
emCalculator 1.0

webcreate IT SOLUTIONS
www.webcreate-nrw.de
webcreate ist offline   Mit Zitat antworten
Alt 11.04.2008, 11:53   #7
TP-Supporter
 
Benutzerbild von buffy2511
 
Registriert seit: Feb 2005
Ort: Braunschweig
buffy2511 macht alles soweit korrekt
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
buffy2511 ist offline   Mit Zitat antworten
Alt 11.04.2008, 12:12   #8
TP-Moderator
 
Benutzerbild von Rizzo
 
Registriert seit: Aug 2004
Ort: Kaiserslautern
Rizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine User
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.
Rizzo ist gerade online   Mit Zitat antworten
Alt 11.04.2008, 12:21   #9
TP-Moderator
 
Benutzerbild von Adromir
 
Registriert seit: Jun 2004
Ort: Hannover
Adromir lebt für das TP und seine UserAdromir lebt für das TP und seine UserAdromir lebt für das TP und seine UserAdromir lebt für das TP und seine UserAdromir lebt für das TP und seine UserAdromir lebt für das TP und seine User
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
Adromir ist offline   Mit Zitat antworten
Alt 11.04.2008, 12:23   #10
TP-Supporter
 
Benutzerbild von buffy2511
 
Registriert seit: Feb 2005
Ort: Braunschweig
buffy2511 macht alles soweit korrekt
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
buffy2511 ist offline   Mit Zitat antworten
Alt 11.04.2008, 12:24   #11
TP-Supporter
 
Benutzerbild von buffy2511
 
Registriert seit: Feb 2005
Ort: Braunschweig
buffy2511 macht alles soweit korrekt
Zitat:
Zitat von Adromir Beitrag anzeigen
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
buffy2511 ist offline   Mit Zitat antworten
Alt 11.04.2008, 12:50   #12
TP-Supporter
 
Benutzerbild von buffy2511
 
Registriert seit: Feb 2005
Ort: Braunschweig
buffy2511 macht alles soweit korrekt
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
buffy2511 ist offline   Mit Zitat antworten
Alt 11.04.2008, 19:55   #13
TP-Moderator
 
Benutzerbild von StephanF
 
Registriert seit: Feb 2003
Ort: Erfurt
StephanF ist ein richtiges Arbeitstier - DANKEStephanF ist ein richtiges Arbeitstier - DANKEStephanF ist ein richtiges Arbeitstier - DANKEStephanF ist ein richtiges Arbeitstier - DANKE
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!!
StephanF ist offline   Mit Zitat antworten
Alt 11.04.2008, 20:47   #14
TP-Moderator
 
Benutzerbild von StephanF
 
Registriert seit: Feb 2003
Ort: Erfurt
StephanF ist ein richtiges Arbeitstier - DANKEStephanF ist ein richtiges Arbeitstier - DANKEStephanF ist ein richtiges Arbeitstier - DANKEStephanF ist ein richtiges Arbeitstier - DANKE
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!!