Session_ID(); sicher?

ProToniX

Mitglied
Hi ich wollre nur ma nachfragen wie sicher die session ID's sind...

Wenn sich ein User einlogt schreibe ich die Session_ID einfach in die Tabelle...
und überprüfe es dann intern also session_id wird nicht per $_GET übermittelt.

weil hier auszug von meinem script
sieht die logged in function... so aus...


PHP:
function logged_in()
{
    global $membertable;
    $sql="SELECT ID
    FROM `".$membertable."`
    WHERE sessid='".session_id()."'
    LIMIT 1";
    $result= mysql_query($sql);
      return (mysql_num_rows($result)==1);
}

Is das so sicher wenn ich einfach in die tabelle schreibe und vergleiche der session_id's ?
 
Hmm, du solltest lieber auf Session-Variablen zurückgreifen, da kannst du dann
die UserID auch gleich eindeutig machen und sicher sein, dass sie nicht irgend-
wenn einmal wieder auftaucht.

Wenn man bezüglich der Sicherheit mal überlegt, ist es höchstens so sicher, wie
Session-Variablen.
Denn stell dir folgendes Szenario vor:
Ein User hat eine URL von deiner Seite aus seinem Browser kopiert und
schreibt diesen dann z.B. in einen Chat => Jeder User hat seine SessionID
(mal davon ausgegangen, dass aus irgend einem Grund die SessionID der URL
mit übergeben wurde)
Jetzt deaktiviert ein bösartiger User in seinem Browser die Cookies und ruft die
Seite mit der SessionID des anderen Users auf.
Ob es so einfach funktioniert, weiß ich nicht, aber wenn a) die User nicht sinnlos
ihre SessionIDs verbreiten und b) du Session Variablen benutzt ist es jedenfalls
etwas sicherer. (Verbessert mich)
 
hmm gibts auch nen nettes beispiel wie ich das am besten mache

nur so vorab in der Index.php wird oben die session gestartet session_start();
also egal welcher user die site betritt startet eine session

wenn der user sich einlogt wird die session_id() vom user in die mysqltabelle geschrieben und bei jeder neuen site verglichen... wenn die session_id mit der in der datenbank übereinstimmt ist er eingelogt allerdings wird die session_id nicht in der adresszeile übermittelt...

hier ma meine sessionhelper file

PHP:
function connect()
{
global $datahost, $datauser, $datapass, $database;
mysql_connect($datahost, $datauser, $datapass);
mysql_select_db($database);
}

function disconnect()
{
mysql_close();
}

function user_lvl()
{
    global $membertable;
    $sql="SELECT userlvl
    FROM `".$membertable."`
    WHERE sessid='".session_id()."'
    LIMIT 1";
    $result= mysql_query($sql) or die(mysql_error());
    $userlvl= mysql_fetch_assoc($result);
    return $userlvl['userlvl'];
}

function check_user($name, $pass)
{
    global $membertable;
    $sql="SELECT ID
    FROM `".$membertable."`
    WHERE username='".$name."' AND pass=MD5('".$pass."')
    LIMIT 1";
    $result= mysql_query($sql) or die(mysql_error());
    if ( mysql_num_rows($result)==1)
    {
        $user=mysql_fetch_assoc($result);
        return $user['ID'];
    }
    else
        return false;
}

function login($userid)
{
    global $membertable;
    $sql="UPDATE `".$membertable."`
    SET sessid='".session_id()."'
    WHERE ID=".$userid;
     mysql_query($sql);
}

function logged_in()
{
    global $membertable;
    $sql="SELECT ID
    FROM `".$membertable."`
    WHERE sessid='".session_id()."'
    LIMIT 1";
    $result= mysql_query($sql);
      return (mysql_num_rows($result)==1);
}

function logout()
{
    global $membertable;
    $sql="UPDATE `".$membertable."`
    SET sessid=NULL
    WHERE sessid='".session_id()."'";
     mysql_query($sql);
}

Ich mein ich will ja nur wissen ob einer die selbe session_id haben kann wie ein anderer ?

wenn ja wie kann ich das verhindern oder erweitert prüfen oda soll ich einen komplett anderen login verwenden ?
 
Zuletzt bearbeitet:
Ich mein ich will ja nur wissen ob einer die selbe session_id haben kann wie ein anderer ?
Nein!
Höchstens über einen längeren Zeitraum hinweg, aber da ist es wieder uninter-
resant, weil es die "erste" Session ID ja nicht mehr gibt.

Aber wieso gibst du den Members nicht eindeutige IDs?
Mit dem MySQL-Spalten-Attribut AUTO_INCREMENT ist sowas leicht zu realisieren!

Ps: Ein freundlicher Hinweis auf den Groß- und Kleinschreibungs-Teil unserer
Netiquette ;)
 
Hmm, was heißt sicher..

Du hast dann auf jedenfall eine andere (und wohl auch eine bessere) Methode,
um die User zu identifizieren (mir ist sowieso fraglich, wie du sie per Session ID
über einen längeren Zeitraum wiederverwendbar halten willst :rolleyes:), ist wohl
die AUTO_INCREMENT Methode.

Aber du musst dann trozdem die User ID mit Sessions speichern.
Es ist aber auf jedenfall besser, kleine Integer-Zahlen als ~32Byte lange alpha-
numerische Strings zu verwenden!
 
Zu der Frage ob die Session ID eindeutig ist, ja sollte sie sein.
Aber um den Sessionklau (beschrieben im Post von Fabian Hoffmann)
einzugehen, da könntest du mit session_regenerate_id() (ab PHP 4.3.2) vorbeugen, so wird bei jedem Scriptaufruf die sessionID des users geändert (nicht aber der inhalt der Session).
Nur wenn du die Sessions in der DB speicherst, müsstest du sie dort dann
logischerweise auch ändern....

Ich würde da auch eher die User per Auto_increment ID identifizieren, diese ID in der Session speichern und bei jedem Scriptaufruf die ID aus der Session mit entpsrechenden Daten aus der DB vergleichen.
 
also ich habs jetz mit 32 byte alphanumerischen code gemacht und dann noch die IP gelogt die ich auch noch immer überprüfe obs auch wirklich der user ist *gg*
 
soweit ich weiss dürftest du bei AOL-Usern aber Probleme bekommen, da die Ihre IP beim Surfen wechseln aufgrund der AOL-eigenen Proxies oder habe ich da was falsch in Erinnerung?
 
Zurück