SELFPHP: Version 5.8.1 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche


International PHP Conference


WebTech Conference



CronJob-Service    
bei SELFPHP mit ...



 + minütlichen Aufrufen
 + eigenem Crontab Eintrag
 + unbegrenzten CronJobs
 + Statistiken
 + Beispielaufrufen
 + Control-Bereich

Führen Sie mit den CronJobs von SELFPHP zeitgesteuert Programme auf Ihrem Server aus. Weitere Infos



PHP Summit


Software Architecture Summit


:: Buchempfehlung ::

Das Zend Framework

Das Zend Framework zur Buchempfehlung
 
HTML5 Days


JavaScript Days


:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Deine Leidenschaft ist die Unterwasserfoto-grafie?


Dann ist Qozido genau das Richtige für Dich!

Die Bilderverwaltung mit Logbuch für Taucher und Schnorchler ist da!

www.qozido.de

 


Zurück   PHP Forum > SELFPHP > PHP für Fortgeschrittene und Experten

PHP für Fortgeschrittene und Experten Fortgeschrittene und Experten können hier über ihre Probleme und Bedenken talken

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 01.08.2009, 13:50:30
SevenTeen SevenTeen ist offline
Anfänger
 
Registriert seit: Aug 2009
Alter: 23
Beiträge: 6
SevenTeen befindet sich auf einem aufstrebenden Ast
Session Problem

Guten Tag, bin neu hier und würde mich über ein wenig Hilfe freuen.

Problematik:
********************************************************************** ***

Ich arbeite im Moment an einem Browsergame und will die Sicherheit hinter dem Login
ein wenig verfeinern.

Darum habe ich vor Usern zu verbieten, dass sie sich parallel ein 2. Mal mit dem gleichen
Account anmelden können. (Würde zu Problemen beim zb. schreiben in die DB führen)
Ich bin zu folgender Lösung gekommen:

Bei erfolgreichem Anmelden erstelle und sichere ich die jetzige session_id() unter der ID
des users in der SQL Datenbank und kann somit in der darauf folgenden ingame.php
anprüfen, ob die jetzige, der in der Datenbank (quasi von damals beim einloggen)
entspricht.

Loggt sich also ein 2. User unter dem gleichen Account ein bekommt dieser eine NEUE
session_ID(), diese wird darauf in die Datenbank geschrieben.

So. Wenn jetzt User 1 die Seite refresht kommt es wie gesagt zu einem neuen Abprüfen.
User 1 vergleicht seine session_ID() mit der in der Datenbank. Nun steht aber eine neue
drinnen. Er wird darauf informiert, dass sich ein 2. User angemeldet hat und wird gekickt.
Ich denke soweit ist alles zu verstehen.

Mein Problem:
********************************************************************** ***

Sobald User 1 seinen Browser refresht und es zur Prüfung kommt:
übernimmt User 1 tatsächlich den Wert der session_id() von User2 !!

Somit sind Browser session_id() und Datenbank session_id() gleich und der User darf
passieren.

Kleiner Ausschnitt aus der login.php

PHP-Code:
session_unset(); 
session_destroy();
            
session_id(rand_str()); /* habe es mit regenerate_session_id() ersetzt, im glauben
die funktion würde schuld daran sein, dass die sid von User 1 eben auch refresht wird.
hier wird nur ein neuer String generiert (32 zeichen)
*/
session_start(); 
Es wird also vor dem Login die alte Session 100% zerstört und eine neue mit neuer sID
angefangen. Warum bekommt User 1 dennoch nach refresh der Seite plötzlich die neue
zugewiesen? Seltsamerweise werden auch Rohstoffe, Ingame-Name etc kopiert =/


PS: Da ich schon einen ganzen Aufsatz geschrieben habe, wollte ich nicht auch noch
dutzende PHP Zeilen einbinden. Für mehr Code (zur Verständlichkeit) bitte melden, dann
poste ich zb. die komplette Login.php und Ingame.php

Geändert von SevenTeen (01.08.2009 um 14:07:31 Uhr)
Mit Zitat antworten
  #2  
Alt 01.08.2009, 14:20:59
DokuLeseHemmung DokuLeseHemmung ist offline
SELFPHP Experte
 
Registriert seit: Jun 2008
Beiträge: 2.233
DokuLeseHemmung befindet sich auf einem aufstrebenden Ast
AW: Session Problem

Warum machst du es dir nicht so schön, wie du es in der Einleitung beschrieben hast..


Ich sehe dein Problem nicht.


PHP-Code:
if(falsche_sid_in_db())
{
  
$_SESSION=array();
  
session_regenerate_id(true); // kannste auch weglassen
  
echo 'du must dich neu anmelden';


PS:
Das SID Gehampel kannst du dir sparen. Es gibt keine Notwendigkeit die SID zu wechseln. Und wenn doch, dann ist session_regenerate() durchaus angemessen.
Mit Zitat antworten
  #3  
Alt 01.08.2009, 14:25:09
SevenTeen SevenTeen ist offline
Anfänger
 
Registriert seit: Aug 2009
Alter: 23
Beiträge: 6
SevenTeen befindet sich auf einem aufstrebenden Ast
AW: Session Problem

Mein Problem ist glaube ich, dass meine bzw auch deine Abfrage nie funktionieren kann...
Weil sobald ich die Seite von User 1 refreshe er schon die neue Session ID hat und erst dann
in die Abfrage springt...
Anscheinend habe ich momentan eine Denksprerre...

Vielleicht sollte ich erwähnen, dass sich das Problem nicht nur bei gleichen sondern auch bei
fremden Accounts zeigt...

Fritz2000 wird mit allen attributen wie name, rohstoffe, SID zu Mustermann101 mit komplett
anderen attributen...

kann es daran liegen, dass die Session nie komplett zerstört wird, sondern aktualisiert ? Oo

Geändert von SevenTeen (01.08.2009 um 14:41:00 Uhr)
Mit Zitat antworten
  #4  
Alt 01.08.2009, 14:55:39
Benutzerbild von vt1816
vt1816 vt1816 ist offline
Administrator
 
Registriert seit: Jul 2004
Beiträge: 3.184
vt1816 befindet sich auf einem aufstrebenden Ast
vt1816 eine Nachricht über Skype™ schicken
AW: Session Problem

Zitat:
Zitat von SevenTeen Beitrag anzeigen
[...]
Vielleicht sollte ich erwähnen, dass sich das Problem nicht nur bei gleichen sondern auch bei
fremden Accounts zeigt...

Fritz2000 wird mit allen attributen wie name, rohstoffe, SID zu Mustermann101 mit komplett
anderen attributen...

kann es daran liegen, dass die Session nie komplett zerstört wird, sondern aktualisiert ? Oo
Da wäre dann wohl mal etwas (mehr) Code angebracht ...
__________________
Gruss vt1816


Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.
Ansosnten gilt: Hilfe ausserhalb dieses Thread (PN, Skype, Mail, ICQ, etc...) nur per Barzahlung oder Vorauskasse!

Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!
Mit Zitat antworten
  #5  
Alt 01.08.2009, 15:17:55
SevenTeen SevenTeen ist offline
Anfänger
 
Registriert seit: Aug 2009
Alter: 23
Beiträge: 6
SevenTeen befindet sich auf einem aufstrebenden Ast
AW: Session Problem

Hier die problematische Login.php:

PHP-Code:
function login() {
    if(
$_REQUEST['login']) {
        
db_connect();    
        
        
//Strip ' Using Function -> = 
        
$_REQUEST['l_username']        = mysql_real_escape_string($_REQUEST['l_username']);
        
$_REQUEST['l_password']        = mysql_real_escape_string($_REQUEST['l_password']);
        
        
//Look if user is in DB
        
$query "SELECT * FROM u_users WHERE username='".$_REQUEST["l_username"]."' and password=sha1('".$_REQUEST["l_password"]."') and activated = 'JA'";
        
$result mysql_query($query);
        
        
//Check result
        
if (!$result) {
            echo 
"Interner Fehler beim Einloggen! Result = Negative!";
            
db_close();
            exit;
        }
        
$num mysql_num_rows($result);
        
        if (
$num 0){
            
session_unset();         //Versuch alle alten Session-Variablen zu leeren
            
session_destroy();        //Versuch alle alten Sessions zu schließen
            
            
session_id(rand_str());    //Erstellen einer neuen sID
            
session_start();        //Starten der neuen Session mit neuer sID
            
            
$_SESSION['user']    = $_REQUEST['l_username'];
            
$_SESSION['ID']        = get_ID();    //Funktion die die ID des Users zurückgibt (PK in der Tabelle)
            
$_SESSION['perm']    = true;        //Permission zum weiterleiten auf ingame.php
            
$_SESSION['time']    = time();    //Zeitstempel für ablauf einer Session (später)
            
            
db_connect();
            
$query "UPDATE u_users SET last_session_time='".$_SESSION['time']."', last_session_id='".session_id()."' WHERE ID='".$_SESSION['ID']."'";
            
$session mysql_query($query);
            if(!
$session) { echo "Abfrage: 'session':'UPDATE' konnte nicht ausgeführt werden: " mysql_error(); exit; }
            
            echo 
"<span style='color:#009900;'>Erfolgreich validiert! <a href='ingame.php'>Hier Klicken...</a></span>";
        }    
        else {
            
$_SESSION['perm'] = false;
            echo 
"Sie haben ein falsches Passwort eingegeben oder der Benutzername existiert nicht!";
            
db_close();
            exit;
        }
        
session_write_close();
        
db_close();
    }

Hier die heikle Abfrage in der Ingame.php bevor das Spiel angezeigt wird:

PHP-Code:
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<link rel="stylesheet" type="text/css" href="styles/ingame.css" />
<title>Browsergame</title>
</head>
<body>
<?php
if($_SESSION['perm'] == true) {
    require_once(
'functions/functions.php');
    
db_connect();
    
    
//Check if session valid +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    
    
echo "Browser sID:".session_id();
    echo 
"<br />Datenbank sID:".get_last_session_id();
    
    
/*Problem: Man meldet sich mit dem gleichen Account ein 2. Mal ein. Rein theoretisch wird durch die Programmierung jedem Tab(oder Fenster)
      mit dem Spiel eine eigene Session zugewiesen. Ist auch so. Siehe Ausgabe oben.
      Sobald ich aber das 1. Fenster refreshe (nach Veränderung der Session ID durch das 2. Einloggen im 2. Tab) nimmt sie alte Session ID den
      Wert der neuen an!! WARUM??? (Kann somit nicht auf Änderung abfragen und 2. Einloggen verhindern)
    */
    
    
if(session_id() != get_last_session_id()) {
        echo 
"<div align='center' class='error'><br /><br />Ihre Sitzung wurde überschrieben! Bitte loggen Sie sich erneut ein!<br /><br /><a href='index.php'>Zurück zur Startseite</a></div>";
        
session_unset(); 
        
session_destroy();
        exit;
    }

    
//Check if Session expired +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    
$SESSION_TIME 1800//1800 seconds/SESSION
    
    
if(time() > get_last_session_time()+$SESSION_TIME) {
        echo 
"<div align='center' class='error'><br /><br />Ihre Sitzung ist abgelaufen! Bitte loggen Sie sich erneut ein!<br /><br /><a href='index.php'>Zurück zur Startseite</a></div>";
        
        
session_unset();
        
session_destroy();
        exit;
    }
    
    
//Get Users ONLINE +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    
$online users_online();
        
    
//Get general information like the ID, scores, the rank, friends, enemies ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    
$info    get_general_info();
    
    
$punkte            $info[0];
    
$rang            $info[1];
    
$freunde        $info[2];
    
$feinde            $info[3];
    
    
//Get game information like resources, population, resource-border +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    
$game    get_resources();
    
    
$holz        $game[0];
    
$nahrung    $game[1];
    
$stein        $game[2];
    
$eisen        $game[3];
    
$muenzen    $game[4];
    
$population    $game[5];
    
$lager        $game[6];
?>
//...
//... Rest des Spiels... hauptsächlich HTML ...
Problematisch ist hier in der ingame.php nur der Teil: "//Check if session valid"

[mod: link entfernt]

Ihr seht oben in der ingame.php den aktuellen sID Status.
Einfach mit admin einloggen, danach mit RTG_Leks... und darauf den admin mal refreshen

Hoffe das hilft, gruß

Geändert von vt1816 (01.08.2009 um 18:18:18 Uhr)
Mit Zitat antworten
  #6  
Alt 01.08.2009, 15:18:40
DokuLeseHemmung DokuLeseHemmung ist offline
SELFPHP Experte
 
Registriert seit: Jun 2008
Beiträge: 2.233
DokuLeseHemmung befindet sich auf einem aufstrebenden Ast
AW: Session Problem

Zitat:
Weil sobald ich die Seite von User 1 refreshe er schon die neue Session ID hat und erst dann in die Abfrage springt...
Warum?
Machs doch anders rum.
Mit Zitat antworten
  #7  
Alt 01.08.2009, 15:48:28
SevenTeen SevenTeen ist offline
Anfänger
 
Registriert seit: Aug 2009
Alter: 23
Beiträge: 6
SevenTeen befindet sich auf einem aufstrebenden Ast
AW: Session Problem

Wie? Ich verstehe nicht ganz wie du dir das vorstellst... Kannst du mir auf die Sprünge helfen?

Um in die Abfrage zu springen muss die Seite doch erstmal geladen werden und da is
ja das problem... Da ist die Session_ID dann ne andere..

Oder hab ich was übersehen *verwirrt*

gruß
Mit Zitat antworten
  #8  
Alt 01.08.2009, 16:13:20
DokuLeseHemmung DokuLeseHemmung ist offline
SELFPHP Experte
 
Registriert seit: Jun 2008
Beiträge: 2.233
DokuLeseHemmung befindet sich auf einem aufstrebenden Ast
AW: Session Problem

Die sessionid ändert sich nur, wenn du session_regenerate_id() aufrufst. Oder händisch eine setzt. Lass das erstmal sein.


Denke logisch!

Was must du als erstes tun? session_start() !
Du prüfst ob in $_SESSION eine Userid liegt.
Wenn nein: Loginvorgang
Ja: prüfen ob sessionid zu userid passt
Passt?
Nein: Logout und loginmaske.
Ja: alles ist gut
Mit Zitat antworten
  #9  
Alt 01.08.2009, 16:59:15
SevenTeen SevenTeen ist offline
Anfänger
 
Registriert seit: Aug 2009
Alter: 23
Beiträge: 6
SevenTeen befindet sich auf einem aufstrebenden Ast
AW: Session Problem

aber wie hindert das jemanden ein 2. mal einzuloggen?
Mit Zitat antworten
  #10  
Alt 01.08.2009, 17:03:45
DokuLeseHemmung DokuLeseHemmung ist offline
SELFPHP Experte
 
Registriert seit: Jun 2008
Beiträge: 2.233
DokuLeseHemmung befindet sich auf einem aufstrebenden Ast
AW: Session Problem

Gar nicht!!
Wer sich frisch einloggt, hat gewonnen.
Der alte steht im Regen. Hat ausgespielt.
Zitat:
prüfen ob sessionid zu userid passt
Passt?
Nein: Logout
Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Problem mit Google wg Session IDs nexus2 PHP für Fortgeschrittene und Experten 9 06.12.2007 19:46:41
Problem mit Lokalisierung eines SESSION - Problems Fabian85 PHP für Fortgeschrittene und Experten 5 03.10.2005 20:17:54
session problem mit session id Fabian85 PHP für Fortgeschrittene und Experten 24 01.02.2005 08:30:19
Session Problem mare26 PHP für Fortgeschrittene und Experten 1 08.12.2004 13:30:39
Session Cookies und use_trans_sid Problem Funjoy PHP für Fortgeschrittene und Experten 22 26.07.2004 22:16:08


Alle Zeitangaben in WEZ +2. Es ist jetzt 23:09:38 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.


© 2001-2014 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt