Wozu eigentlich noch Sessions

Ja ausserdem hast du schon mal eine sessionsvariable via URL verändert?

Ich auch nicht! Für die Sicherheit sind SESSIONEN schon klasse, aber man muss diese auch richtig anwenden.

Und noch was. Du schreibst ein Formular über sagen wir 10 Seiten. Dazwischen setzt der User aus und schaut kurz ins Forum. Danach entschliesst er sich doch wieder an das Formular zu machen, und findet erstaunlich schon das ausgefüllt vor, was er zuvor ausgefüllt hatte.

Ist das nicht gut?
 
Mikey hat gesagt.:
Damit diese ID während der ganzen Zeit bekannt ist, wird sie - wie geschrieben, im Cookie oder mit GET übergeben.
Probiere mal print_r ( $_COOKIE ); und Du bekommst:
Array
(
[PHPSESSID] => 1a795ccb911dc6930eeaa880db676878
)
Also hier wieder der Default-Name (oder der, welchen wir mit session_name(...) bestimmt haben.)
Wenn keine Cookies akzeptiert werden, wird die ID mit GET übergeben: index.php?PHPSESSID=1a795ccb911dc6930eeaa880db676878
Schau mal in so einem Fall in Deinen Browser-Quelltext. Da findest Du dann plötzlich alle Deine Links von PHP verändert:
<A HREF="neueseite.php?PHPSESSID=1a795ccb911dc6930eeaa880db676878">.... Auf gut deutsch: Du brauchst Dir überhaupt keine Gedanken über die Hintergründe machen, da kümmert sich komplett der Interpreter drum!
Und was machst Du mit Links, die beispielsweise in externen JavaScripts stehen? Also ich würde mich nich drauf verlassen, dass automatisch an allen Links der Session-Name und die zugehörige Session-ID drangeghangen werden.
 
Chino hat gesagt.:
Und was machst Du mit Links, die beispielsweise in externen JavaScripts stehen? Also ich würde mich nich drauf verlassen, dass automatisch an allen Links der Session-Name und die zugehörige Session-ID drangeghangen werden.
Da gebe ich Dir recht! Aber wer Javascript aktiviert hat, wird in den meisten Fällen auch Cookies akzeptieren, und damit muss der URL nichts angehängt werden. Und die letzten paar Promille übervorsichtiger User müssen dann halt auf ein wenig Komfort verzichten! Wer halt auf alles verzichtet darf sich nicht über unvorhergesehene Ergebnisse wundern. Das mag sich jetzt zwar arrogant anhören, aber irgendwo muss ich auf meiner Seite den Kompromiss zwischen Komfort und Universalität eingehen (dürfen)!

In Daensch Frage ging es m.E. auch um eine grundlegende Einführung in Sessions. Da kann man nicht auf jede kleine Eventualität eingehen.
Deine Anmerkung gehört mehr in die Fortgeschrittenen-Kategorie und sollte vielleicht in einem getrennten Thread mal vertieft werden ?!

Herzliche Grüße,
Micha
 
Da hat micha recht chino =)

Ich mein die Bemerkung ist zwar gut.. aber ich denke nicht das wir hier (zumindest ich) scripte schreibe in denen ich alles berücksichtigen werde.

Aber zum thema "arrogant".. ich bin der gleichen Ansicht.
Es heisst z.b. ja auch das man wenn man eine WEBSEITE in flash macht auch eine HTML version zur Verfügung stellen sollte, oder Auflösung unter 1024X768 berücksichtigen.
Ich denke das die paar die darunter fallen die dort nicht zutreffen, irgendwelche Eltern sind die mal das Internet nutzen. wer auf bestimmte sachen verzichtet muss unteranderen seinen komfort einschränken trifft somit zu. =) Ich mags auch lieber komfortabel und ansehnlich, von Seiten die mir nicht suspekt vorkommen!

@micha: Die help-file hab ich sogar auf meiner Tastatur-Hotkeys gespeichert =) Allerdings fehlt es mir oft an wirklich guten erklärungen oder Beispielen. Wenn ein Begriff den ich suche (wenn ich überhaupt ersma weiss welchen ich brauche =)) steht er meistens erklärt. Bsp selten und wenn meisst knapp.
Ich bin ein Mensch der sich sachen leichter Merkt wenn ich es praktisch probiere.. learning by doing halt =)

Die Variante die SID in der URL weiterzugeben halte ich für ziemlich unüberlegt. Zumal ich z.b. ein Script mache für meine Community. Da hat nicht so wirklich jeder irgendwie die Ahnung von Internet =) Mehr von Spielen usw (weil meist um die 40) Wenn dieser dann seine Url einen Kumpel gibt (incl. ?SID=blaaaa) dann hab ich das Problem das er dann evtl mit seinen Rechten auf alle Funktionen hat !?

zu GET und POST meinte ich eher folgendes Problem:
PHP:
echo $_GET("var");   // keine ausgabe
echo $_POST("var");  // ausgabe

Wichtigste Frage:
ich kann direkt über die session id vom user abfragen oder?
d.h. ich mache meine STATUS Anfragen oder alles weitere dann mit folgendem sql code:
Code:
$result = mysql_query ("SELECT benutzerrecht FROM benutzer WHERE session_id = ".$_SESSION('id')."");
würde das funktionieren?

Greetz²all & thx für die Zahlreiche beteiligung =)

PS: Du solltest mal ein TUT über Sessions schreiben =) Thema:Session´s und Ihre Funktionen.. du kannst es ziemlich gut verständlich ausdrücken und nich wie die meisten verrückten goldmember einen zutexten das man sich das und dies tut durchlesen soll >=) like :rtfm:
 
so... hab damit n bissl rumexperemtiert..
siehe : http://www.west-german-invasion.de/test/stopuhr.php


den sql befehl jez zwar nich so getestet.. aber eine kleine Stoppuhr mit timestamp kreiert (timestamp versuch ich auch grad zu verstehen *g* die umwandlung von den sekunden ind hour,min, sec hab ich noch nich ganz verstanden.. naja..kommt morgen)

Wäre es sinnvoll eig. beim loginscript z.b.
PHP:
<?
session_name("$username");
session_start();
halt eine session pro user der sich eingeloggt hat zu machen?
und es heisst session_name muss noch vor START sein, wobei dieses ja schon am anfang sein muss.
Wie mache ich z.b. eine Abfrage like.
PHP:
if (isset($username))
{ session_name("$username"); }

greetz&mfg

PHP:
<?  // STOPUHR.PHP
session_name("stopuhr");
session_start();
if ($stop == "Stopp")
	SESSION_UNREGISTER("uhr");

if (isset($_SESSION["uhr"]))
 	{		
		$online = time() - $_SESSION["start"];
		$test = $online." Sekunden Online";
		echo $test;
	 	?>		
	 	 <form action="stopuhr.php" method="post">
		 <input name="stop" type="submit" value="Stopp"> 
	         <a href="<? echo $_SERVER['PHP_SELF']; ?>">REFRESH</a>
         </form>
 		<?
	}
	else
	{
		SESSION_UNREGISTER("start");
		$_SESSION["start"] = time();
		$online = time() - $_SESSION["start"]." Sekunden Online";
		echo $online;
		$_SESSION["uhr"] = "1";
		?>
		<form action="stopuhr.php" method="post">
		<input name="start" type="submit" value="Start">
		</form>
		<?		
 	}  
 ?>
 
Zuletzt bearbeitet:
Moin Moin...

Daensch hat gesagt.:
Die help-file hab ich sogar auf meiner Tastatur-Hotkeys gespeichert =) Allerdings fehlt es mir oft an wirklich guten erklärungen oder Beispielen.
Stimmt, es ist teilweise etwas oberflächlich. Zwar sind die Inhalte sehr gut, gehen aber häufig nicht tief genug in die Materie.

Daensch hat gesagt.:
Die Variante die SID in der URL weiterzugeben halte ich für ziemlich unüberlegt..
Ehm, stop! Reden wir jetzt aneinander vorbei? Die Session-ID wird in Cookies übermittelt, außer das geht nicht, dann in der URL.
Normalerweise gibst Du doch keinem User eine URL mit angehängter SID?! Wie gesagt - die Session verfällt i.d.R. nach 3 Stunden...

Wie ich das realisiere:
Der Benutzer gibt Name/Kennwort ein und klickt auf Login. Ich überprüfe die Gültigkeit (in dem ich mit der Datenbank vergleiche) und reagiere entsprechend mit Fehler- oder Willkommens-Meldung. Außerdem speichere ich nun wichtige Merkmale in der (eigentlich gerade frisch begonnenen) Session, z.B. den User-Namen.
Beim Klick auf Logout wird der Username wieder aus der Session entfernt.
So kann ich auf jeder Seite auf Username <> "" prüfen, um den Login-Status zu erkennen.

Ähnliches gilt für Zugriffsrechte o.ä. Ich speichere einen Status in der DB und nach Login in der Session, z.B. je größer, desto berechtigter. (Jedes Bit steht für eine Berechtigung und kann mit z.B: $status & 0x02 > 0 abgefragt werden.)

Das heißt, dass alles, was der User macht, in der Session UND in der DB abgelegt werden muss. Beim nächsten Login werden diese Dinge wieder aus der DB geholt.

So hat sich auch schon Deine Frage mit dem Session-Namen erklärt, welcher also zunächst völlig uninteressant ist. Den Usernamen speicherst Du in der Session ($_SESSION['username'] = $username); oder so. Anders funkt


Nicht die SID speichern und hoffen, das beim nächsten Mal noch alles da ist!


zu GET und POST meinte ich eher folgendes Problem:
PHP:
echo $_GET("var"); // keine ausgabe
echo $_POST("var"); // ausgabe
Also, wenn Du seite.php?var=irgendwas aufrufst, wirst Du mit echo $_GET['var']; auch irgendwas angezeigt bekommen (wichtig: Eckige Klammern - GET ist ein Array!). Für $_POST natürlich nichts.

Für Deine Experminetierphase würde ich Dir empfehlen, folgendes ins Skript aufzunehmen:
<FONT color=black>
PHP:
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
Dann bekommst Du eine Meldung, das $_POST['var'] nicht definiert ist!

Das ganze gilt natürlich auch analog andersrum, wenn Du METHOD=POST verwendest.
Tipp: Wenn Du $_REQUEST['var'] verwendest, ist var immer drin, egal ob über GET oder POST.

Wichtigste Frage:
ich kann direkt über die session id vom user abfragen oder?
d.h. ich mache meine STATUS Anfragen oder alles weitere dann mit folgendem sql code:
$result = mysql_query ("SELECT benutzerrecht FROM benutzer WHERE session_id = ".$_SESSION('id')."");
Nö. Erstens müsstest Du session_id() statt $_SESSION['id'] nehmen. Zweitens würde ich das wie gesagt nicht über die SID regeln.

Warte mal, ich bringe mal hier ein wenig Beispiel-Quelltext:
PHP:
DEFINE ( '_SALT', "irgendwasschönes" );
DEFINE ( '_STATUS_SUPERVISOR', 0x80 );
.
.
// sql_get_value ist eine vorher von mir definierte Funktion, die halt genau den Wert zurückgibt, den ich über die Query übergebe...
.
.
// Starte Login-Versuch:
$db_pwd = sql_get_value ( sprintf ( "SELECT DECODE(password, '%s') 
FROM user
WHERE nickname='%s'", 
_SALT, $POST['username'] ) );
 
if ( mysql_affected_rows() == 1 )
{ 
if ( $password == $db_pwd )
	{
	$_SESSION['USER'] = $_POST['username'];
	$status = sql_get_value ( sprintf ( "SELECT status FROM user 
		 WHERE nickname='%s'", $_SESSION['USER'] ) );
 
	$_SESSION['SUPERVISOR'] = ( $status & _STATUS_SUPERVISOR ) > 0 ;
	// usw....
	} // if password
else
	echo "Falsches Passwort";
} // if mysql_affected_rows
else
echo "Benutzer unbekannt";
.
.

PS: Du solltest mal ein TUT über Sessions schreiben =) Thema:Session´s und Ihre Funktionen.. du kannst es ziemlich gut verständlich ausdrücken und nich wie die meisten verrückten goldmember einen zutexten das man sich das und dies tut durchlesen soll >=) like :rtfm:
Naja, dem einen oder anderen würde es wirklich mal helfen, zuerst das Handbuch zu lesen anstatt sofort voreilig einen Hilfeschrei ins Forum zu posten. Andererseits bin ich der Meinung, dass ein Forum dazu da ist, den anderen zu helfen und nicht übertrieben mit seinem eigenen Superwissen zu prahlen.
 
Zuletzt bearbeitet:
Stopuhr und register globals

Ja, Du siehst ja, dass es funktionert!

Aber Achtung: Es funktioniert nur, weil register_globals = on ist!
Dadurch wird die Variable $stop automatisch global besetzt.
Sicherer wäre es, mit $_POST['stop'] zuzugreifen.

Aber das ist wieder ein riesiges Kapitel über Sicherheit....

Problematisch wird's, wenn Dein Provider irgendwann mal register_globals auf OFF setzt (was standardmäßig bei irgendeiner PHP-Version, um die 4.1 glaube ich, umgestellt wurde.)
Dann darfst Du Deinen gesamten Quelltext umschreiben....

Oder Du wechselst den Provider... Oder Du willst einfach ein sicheres Skript schreiben...

Da solltest Du zumindest mal drüber nachdenken, um Dir längerfristig Streß zu ersparen...

Micha
 
Wunderbar =)

denke das meiste wäre geklärt und soweit hab ich Sessions denke ich verstanden.. dann kann ich mal mein eigenes Login schreibn =) und werd drauf achten wegen dem $_POST! =))

Wobei.. wie kann ich eigentlich eine Session komplett beenden!?
Hab jez ein LOGOUT script geschrieben und das funktioniert nicht so wie es soll:
http://www.west-german-invasion.de/test/login-self/index.php (Login es egal.. einfach irgendwas)
PHP:
<?
unset($_SESSION["logged"]);
session_unset();
?>
destroy bringt auch nicht den erwarteten Effekt!

Und da fällt mir nochwas gerade auf =) Wenn ich eine der normalerweise include Dateien öffne, ohne über meine Index, gehen die Session Vars natürlich nicht. Warum ist mir klar =) Welche Lösung sollte man dafür nehmen?
PHP:
if (!isset($_SESSION["logged"]))
     {
     session_start(); 
     }
<HTML CONTENT>

thx nochma =)

greetz²all

mfg daensch =)

PS: Die logged ist einfach nur für mich ein status wie eingeloggt! extra für solche abfragen
 
Zuletzt bearbeitet:
hmm
ich glaub es ist euch nicht ganz klar oder?

sessions werden A: aufm server und B client seitig gespeichert
allerdings unterscheiden sich die clientseitigen cookies von richtigen cookies

client seitige session cookies enthalten nur die url und mehr nicht

clientseitige normale cookies enthalten daten

wenn du seiten übergreifend arbeitest ist es egal ob cookie oder session da die daten so oder so exestieren das einzige ist nur normale cookies können abgelehnt werden
session cookies jedoch nicht

ausserdem hatt man bei normalen cookies die möglichkeit die daten auch dann aufrecht zu erhalten wenn der user den browser schließt welches bei einer normalen session UNMÖGLICH ist!

z.b. user configurationen könnte man in cookies sichern welche bei jedem besuch der seite geladen werden können
bei sessions kann man nur die aktuelle laufzeit einstellen und sichern sollange man den browser nicht schließt

soviel zu sessions
der aufwand ist bei beiden der selbe
bei sessions muss ich zu beginn immer die session öffnen
bei cookies muss ich das cookie schreiben
also bleibt es sich gleich was man macht
und die performance spielt bei beiden keine rolle da dies zu gerring ist als das es ins gewicht fallen würde
ledeglich die server platten müssen das speichern können
 
Ich muss wissen wie man folgendes noch löst:

Bleibt die Session ID immer dieselbe.. bis derjenige sich ausgeloggt hat, oder die Session abgelaufen ist?

Wie beende ich eine Session (z.b. bei Logout..) mein script hat dies und es geht nich =(
PHP:
unset($_SESSION['logged']);  // dachte alles selbst zu "löschen"
unset($_SESSION['name']);
unset($_SESSION['passwort']);
unset($_SESSION['logintime']);
session_id();     // versuch die ID auf 0 zu setzen
session_unset();  // alle variable zu löschen geht anscheinend nich ?!
session_destroy();  // auch nicht der erwünschte effekt

dann hätt ich alles durch.. Es funktioniert ja eigentlich alles.. bin noch am überarbeiten =) nur halt das logout nicht.. und wegen der id, das brauch ich für einepräzisere SQL Abfrage!


thx =)
 
Zuletzt bearbeitet:
Zurück