sessionid + mysql?

Hans Hansen

Grünschnabel
Hallo Leute,

ich habe hier ein Shop-prog. das mit php4 session arbeitet, das heisst wenn cookies erlaubt sind werden cookies gesetzt, wenn nicht dann wird die sessid an die url angehangen.

Da ja die sessid an der url ein Sicherheitsrisiko ist. (User loggt sich ein, wählt ein Artikel kopiert die Adresszeile (incl. SID) und
gibt den Link in irgendein Forum an um dazu was zu fragen, und schon ist jeder unter sein namen angemeldet.)

So:
In jeder betreffenden Datei (index) hab ich oben folgendes Stehen:

session_start();

//Sessionregister
include($dateiPfad . "includes/session_register.inc.php");

Jetzt möchte ich das so ändern das die Sessionid in der mysql Datenbank gespeichert wird (mit timestamp).
Dazu habe ich mir ein Script gesucht und eine entsprechende DB Tabelle angelegt.

da ich nun kaum Ahnung von PHP, SQL und so habe:
Frage 1: kann ich das script in einer Datei speichern und immer includen?

beispiel: include($dateiPfad . "includes/session_db.inc.php");

Frage 2:
muss ich die Datei vor : session_start(); includen oder danach?

Beispiel: session_start();
include($dateiPfad . "includes/session_db.inc.php");
//Sessionregister
include($dateiPfad . "includes/session_register.inc.php");

Frage 3: ist es besser die Sessions Daten auch gleich in der DB abzulegen?

Frage 4: kennt jemand vielleicht eine bessere Lösung.
 
Frage 1: Ja
Frage 2: Kommt drauf an ob in der Datei schon ein session_start() ist, wenn ja dann musst du zuerst includen, wenn nein zuerst session_start()
Frage 3: Ja
Frage 4: Ich hab mir damals auch sorgen um die sicherheit gemacht, und hab dann mal ein bisschen gesucht und eine klasse gefunden die die sessid in der datenbank abspeichert und so kann immer abgefragt werden ob der user eingeloggt ist bzw. rechte dazu hat
lange rede kurzer sinn
hier ist mal die url: http://www.php-resource.de/forum/showthread.php?s=&threadid=16212
( kann sein dass du dich da erst anmelden musst, weil das board wahrscheinlich gesperrt ist )

so far

Devil
 
ok,

da im session_db script unten folgendes steht (wegen session_start):

PHP:
session_set_save_handler("sess_mysql_open", "", "sess_mysql_read",
"sess_mysql_write", "sess_mysql_destroy", "sess_mysql_gc");
session_start();
?>

include ich es in den Dateien vor: session_start();


Beispiel:
include($dateiPfad . "includes/session_db.inc.php");
session_start();
include($dateiPfad . "includes/session_register.inc.php");

weiter:

um die Sessiondaten auch in der DB abzulegen, soll ich da die session tabelle um die entsprechenden Felder erweitern oder eine zusätzliche tabelle anlegen (z.B. session-values oder so)?

Und wie muss ich die session-register datei ändern damit
die daten in der DB landen statt im Servcer/temp ?

oder sollte man die session_db.inc... und session_register.inc...
zusammenfügen?

die session_register.inc.php beinhaltet folgendes:

PHP:
<?
if(!session_is_registered('com')) 
{
	$_SESSION['com'] = "false";
	$_SESSION['mail'] = "";
	$_SESSION['kat'] = "";
	$_SESSION['menue'] = "";
	$_SESSION['subMenue'] = "";
	$_SESSION['sessionId'] = rand() . rand();
	$_SESSION['gesamtpreis2'] = "";
	$_SESSION['porto'] = "";
	$_SESSION['best'] = "";
	$_SESSION['b_counter'] = "0";
	$_SESSION['b_id'] = "";
	$_SESSION['langu'] = "de";	
}

if($action != "abwicklung")
{
	$_SESSION['best'] = "";
}
?>
 
wenn du zuerst die datei includest in der session_start() enthalten ist, und dann nochmals session_start() machen willst, wird wahrscheinlich eine fehlermeldung kommen.

die tabelle würde ich einfach um die spalte UserSession ( oder welchen namen du halt nimmst ) erweitern. evtl. noch ein paar extra funktionen wie z.b. last login, was aber nur spielerei ist.

die session id kann doch ruhig in /temp verzeichnis landen, ist doch nicht so schlimm.
du musst halt nur zusätzlich die session id in der datenbank speichern, das geht dann ungefähr so:
Code:
"UPDATE tabelle SET UserSession=".session_id()."

sollten noch fragen offen sein frag einfach :-)
 
hab das nochmal geändert.

habe aus der session_db... die includet wird session_start() reausgenommen und in den index dateien session_start() wieder eingefügt und die session_db.. nach session_start includet, da es immer eine Fehlermeldung gab ala: connect mysql ... oder so.

Sieht jetzt so aus:

PHP:
  <?
session_start();

include($dateiPfad . "includes/session_db.inc.php");
	
// Hauptkonfigurationsdatei
include("config.inc.php");
include("db.inc.php");

//Sessionregister
include($dateiPfad . "includes/session_register.inc.php");
.........hier kommt der rest.....

So das ist jetzt Fehlermeldungenfrei.

Nun soll ja das Script session_db (das ich irgendwo gefunden hate) nach einer gewissen inaktiven Zeit die Session beenden.

Nun ist meine frage wo wird die Zeitspane definiert? in dem Script oder in der DB? kann da irgendwie nix finden, hab da auch nicht so die Ahnung von.

In der DB habe ich eine Tabelle mit drei Spalten:
id / vachar(50)
DATA / mediumtext
t-stamp / timestamp(14)

Das script hänge ich mal als TXT datei an.
 

Anhänge

die zeispanne wird in dieser funktion definiert:
PHP:
function sess_mysql_gc($max_lifetime)
{
    global $sess_mysql;
    // Old values are values with a Unix less than now - $max_lifetime
    $old = time() - $max_lifetime;
    // Delete old values from the MySQL session table
    $result = mysql_db_query($sess_mysql["db"], "DELETE FROM
".$sess_mysql["table"]." WHERE UNIX_TIMESTAMP(t_stamp) < $old") or
die(mysql_error());
    return(true);
}

bei der funktion wird eine variable übergeben welche $max_lifetime ( also maximale lebenszeit der session :-) ) heisst ( angabe der zeit in sekunden ).
dann kommt
PHP:
$old = time() - $max_lifetime;
hier wird dann berechnet ob die session zu alt ist, oder noch neu

PHP:
$result = mysql_db_query($sess_mysql["db"], "DELETE FROM
".$sess_mysql["table"]." WHERE UNIX_TIMESTAMP(t_stamp) < $old") or
die(mysql_error());
und hier werden die einträge aus der datenbank gelöscht wo die eingetragene zeit ( also die zeit die beim start der session eingefügt wurde ) kleiner der oben berechneten zeit ist

meiner meinung nach ist das hier viel zu kompliziert, ich kann dir nur nochmals diese klasse empfehlen. da könnte ich dir auch etwas mehr zwecks verständnis helfen.
also hier nochmals der link
http://www.php-resource.de/forum/showthread.php?s=&threadid=16212

aber ist ja schliesslich deine entscheidung

so far

Devil
 
Hallo,

ich habe mir den link mal angeschaut, es geht da ja um ein reines Usermanagment, ich wollte eigentlich bei dem Shop-prog. hier die ganze sessionid vernichten nach inaktiver Zeit X. Damit auch der WK wieder leer ist wenn ein User dort Artikel abgelegt hat ohn sich anzumelden. Aber egal das mit dem Usermang. könnte auch erstmal reichen.

hab hier mal ein Link aus dem Beitrag dort, wo ich mich gestern (ohne Cookies) eingeloggt hatte, habe heute den Link nochmal aufgerufen und bin immernoch eingeloggt:

http://www.wi01h.de/~temp/session/index.php?mz=e3581e4d3234f33d237912eca491ad38

kannst ja mal schauen, hatte den Namen "happy" benutzt.

Frage: Ist das die richtige Seite wo man das aktuelle Script dazu findet, sind ja reichlich Beiträge in dem Theardt.
 
hab se dir mal angehängt

ps: ich hab eine ältere version, dies ist jetzt die überarbeitet und neuste aus dem forum.
 

Anhänge

Zurück