an "PHP-Session ID" herrankommen...

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Samstag 7. Mai 2005, 12:33

Weiß einer wie man von Python-CGI aus an die PHPSession ID herran kommen könnte???

Ich möchte vom lucidCMS wissen, ob jemand eingeloggt ist oder nicht. Das CMS setzt dazu ein Cookie mit Namen "PHPSESSID" und das ist irgendein Hash-Wert.

Irgendwie muß dieser Hash-Wert mit der ID des Users in der SQL Datenbank verknüpft sein...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
XT@ngel als Gast

Samstag 7. Mai 2005, 14:50

Hi,
ich weiss jetzt nicht wie dieses CMS arbeitet, aber normal ist es so, das PHP seit Version 4 sämtliche Session Daten im tmp dir des Systems speichert.

Wenn der Client Cookies akzeptiert, wird die Session ID über den Cookie weitergegeben. (Session Id ist im cookie vorhanden)
Also der hash Wert den Du meinst ist, da bin ich mir relativ sicher, die Session Id ;-)

Zu PHP 3 zeiten benutzte man entweder die PHPLIB oder hat sich sein eigenes Session management gebaut.

MfG
Andreas
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 31. Mai 2005, 06:44

Der per COOKIE abgespeicherte "PHPSESSID" ist wohl eine MD5 Prüfsumme, sie sieht bsp. so aus:

Code: Alles auswählen

c9a2286dd1a8b9fe6690410be024456a
214d4bd139cbe9dec6f2e98873a9fa9c
Sie wird erzeugt, sobald man die Seiten sich anschaut. Egal ob man eingeloggt ist oder nicht. Wenn man sicht einloggt, ändert sie sich nicht.

Meine Frage ist nun, ob ich irgendwie von Python-CGI aus mit der ID was anfangen kann? Also, ist er eingeloggt? Wenn ja, welcher User ist es?

Aber wahrscheinlich komme ich an die erwähnte TEMP nicht ran, was?

Hier mal die lucid_core/coreAuth.php:

Code: Alles auswählen

<?php
/*plugin authors should ONLY use one of the following auth_ functions:
auth_checkLoggedIn()
auth_checkAdmin($justReturn)
auth_checkUserGroupName($groupName, $justReturn) */
function auth_session() {
    global $sessionStarted;
    if (!isset($sessionStarted)) {
        session_start();
        $sessionStarted = true;
    }
}

function auth_checkAdmin($justReturn=false) {
    auth_checkLoggedIn('',$justReturn);
    $user = db_getUserByID($_SESSION['userID']);
    if ($user['admin']==1) {
        return true;
    } else {
        if ($justReturn) {
            return false;
        } else {
            $_SESSION['loginMessage'] .= translate('auth_admin');
            auth_logout();
        }
    }
}

function auth_checkUserGroupID ($userID, $groupID) {
/* This function is only intended for use by certain core functions.
auth_checkUserGroupName is the preferred API for use by plugins. */
    $userGroups = db_getUserGroups($userID);
    if (in_array($groupID, $userGroups)) {
        return true;
    } else {
        return false;
    }
}

function auth_checkUserGroupName ($groupName, $justReturn=false) {
/* this function is intended to be used by any core or plugin 
function that wants to check if the current logged in user is
a member of a specififcally named group */
    if (auth_checkAdmin(true)==true) {
        //admin users automatically have full access
        return true;
    } else {
        $groupID = db_getGroupID($groupName);
        $inGroup = auth_checkUserGroupID($_SESSION['userID'], $groupID);
        if ($inGroup) {
            return true;
        } else {
            if ($justReturn) {
                return false;
            } else {
                $_SESSION['loginMessage'] .= translate('auth_groupName', array('groupName'=>"<b>$groupName</b>"));
                auth_logout();
            }
        }
    }
}

function auth_checkLoggedIn($pageName='', $justReturn=false) { 
    auth_session();
    if (!isset($_SESSION['logged_in'])) {
        $_SESSION['logged_in'] = false;
        if($justReturn == true) {
            return false;
        }
        display_login($pageName); //pass originally requested page name so that user can be redirected
    }
    //just return if user is already logged in, otherwise display login form
    if ($_SESSION['logged_in'] == true) { 
        $timeStamp = gettimeofday();
        $idleSecondsAllowed = $GLOBALS['corePreferences']['inactivityTimeout'] * 60;
        if (($timeStamp['sec'] - $_SESSION['lastAuthTime']) > $idleSecondsAllowed) {
            $_SESSION['loginMessage'] = translate('auth_timeout');
            if($justReturn != false) {
                return false;
            }
            display_login($pageName);
            exit;
        } else {
            $_SESSION['lastAuthTime'] = $timeStamp['sec'];
            return true;
        }
    }
    //we have not yet returned true, so display the login form and exit further processing
    if($justReturn != false) {
        return false;
    }
    display_login($pageName);
    exit;
}

function auth_logout() {
    session_unset();
    session_destroy();
    auth_checkLoggedIn();
}

function auth_verifyLogin() {
/* This function should only be called as a response to submission of the login form.
It should not be called for any other reason. 
For authenticating before proceeding with other functions, use one of the following:
auth_checkLoggedIn()
auth_checkAdmin()
auth_checkUserGroupName($GroupName)
*/
    auth_session();
//make sure that this is a recent submission (not a re-post from a cached form)
    $timeStamp = gettimeofday();
    $checkTime = $timeStamp['sec'];
    $promptTime = $_POST['PromptTime'];
    $pageRequest = $_POST['pageName'];
    $userName = $_POST['login_username'];
    $timeLimit = 120; //seconds allowed between time prompt is given and time for submission
    if (($checkTime - $promptTime) > $timeLimit) {
        $_SESSION['loginMessage'] = translate('auth_loginDelay');
        display_login($pageRequest);
    }
    if (strstr($userName, ' ')) {
        $_SESSION['loginMessage'] =  translate('auth_noSpaces')."<br />";
        display_login($pageRequest);
    }
    $user = db_getUserByName($userName);
    if (!$user) {
        $_SESSION['loginMessage'] =  translate('auth_invalid')."<br />";
        display_login($pageRequest);
    }
    if ($user['password'] == md5($_POST['login_password'])) {
        $_SESSION['userName'] = $user['name'];
        $_SESSION['userID'] = $user['id'];
        $_SESSION['logged_in'] = true;
        $_SESSION['lastAuthTime'] = $checkTime;
        if ($pageRequest != '') {
            display_page($pageRequest);
        } else {
            return true; //allow caling function (processRequest) decide what to do next
        }
    } else {
        $_SESSION['loginMessage'] =  translate('auth_invalid')."<br />";
        display_login($pageRequest);
    }
}

?>

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
nbkr
User
Beiträge: 28
Registriert: Montag 30. Mai 2005, 11:32

Mittwoch 1. Juni 2005, 15:48

Wie bereits erwähnt: Im Ordner /tmp erstellt PHP für jede Session eine Datei in der Form:

sess_<sessionid Wert>

Die gehört mit dem Nutzer mit dem PHP bzw. der Apache läuft. Du solltest also mit einem Pythonscript darauf zugreifen können. In der Datei sind die ganze Werte die in der PHP Session gespeichert werden vorhanden. Das Schema wie diese Abgespeichert werden habe ich noch nicht ganz geblickt aber es schien ungefähr so zu sein:

Schlüsselname:2:Wert;

Wenn Du dir also das logged_in rausfischst müsstest Du rausbekommen können ob der User eingeloggt ist oder nicht.
Hawk18x

Montag 20. Juni 2005, 14:40

PHPSESSID ist eine globale Variable, die PHP automatisch anlegt, sobald ein session_start() aufgerufen wird.

Ein Tipp:
Wenn du im Cookie keine wirklich verwendbaren Klartextinfos des Users findest, den du identifizieren willst, dann kannste das vergessen, denn mit der PHPSESSID kannste keinen identifizieren. Die ist nur für php da, damit der server weiss, wem er Daten freigeben soll, die in der Session gespeichert werden.
Dekodieren kann man diesen String auch nicht. Leider. Oft versucht, kläglich gescheitert.

Wenn du wirklich wissen willst, wann ein User online kommt oder ist, dann schreib dir nen kleinen Table, wo beim login der username und der timestamp gespeichert werden. Dann noch ne kleine datei, die das ausliest und guckt, wer zB gerade da ist, oder wer vor 5min da war.

Es gibt massenhaft kostenlose Scripte im Netz, die genau diese Funktion haben.

Ich weiss, das dieser Beitrag älter ist, und vielleicht ist er auch nicht mehr aktuell, aber ich wollte trotzdem darauf hinweisen, was war und was ist. Nicht das du ne falsche Richtung einschlägst. Wär schade um die Zeit.
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 20. Juni 2005, 20:08

Ich habe mir in der zwischenzeit ein eigenes LogIn / Session Handling geschrieben:

http://www.python-forum.de/viewtopic.php?p=20070#20070

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten