Zur Navigation

SID über die URL übergeben

1 Isildur

Hallo zusammen

Ich beschäftige mich gerade etwas mit Sessions und das ist ja eigentlich auch eine geniale Einrichtung wenn da nicht der User wäre, der alles was in seiner Macht steht(z.B.Cookies) zu unsicher macht um sich allein darauf zu verlassen. Nun geht es hierbei zunächst mal um einen Counter den ich über Sessions steuern wollte, ein Loginscript für einen Adminbereich kommt wohl später noch dazu. Aber zumindest beim Counter kann ich nicht vorraussetzen, dass Cookies aktiviert sind, da es falls nicht schon durch einen User zu erheblichen Fehlern kommt.

Ich hab ein bisschen durch PHP5&MySQL5 geblättert und bin darauf gestoßen, dass mit der Zeile
ini_set('session.use_trans_sid', 1)
dazu führen soll, dass falls Cookies nicht erlaubt sind(oder auch immer ist nicht genau beschrieben) die SID über die URL übergeben wird. Ich hab auch die entsprechende Zeile in meinen Code geschrieben nur funktionieren tuts irgendwie net.

Woran könnte das liegen? Ist das der richtige Weg die SID per URL übermitteln zu lassen oder gibts noch andere?

31.05.2006 21:23

2 Rudy

Du kannst ini_set nur verwenden, wenn Dein Hoster das erlaubt - die meisten erlauben das nicht. Sonst könnte man oft echt tolle Sachen machen ^^ Im Grunde wäre die PHP-Einstellung trans_sid aber der richtige Weg.

Ich hatte das Problem auch mal und habe das mit einer Funktion gelöst: SID an URL anhängen

Du kannst diese Funktion nach ob_start und der Ausgabe der Inhalte über den Puffer laufen lassen und dann den Puffer mit Session-IDs auf allen internen Links ausgeben. Beim manuellen Weiterleiten mit header("Location... musst Du sie aber trotzdem selbst anhängen.

31.05.2006 21:55 | geändert: 31.05.2006 22:00

3 Isildur

Danke!
Geht das so:
"SID=".session_id()
?

Ne Funktion zum einfügen in die URL hab ich schon(war ne Menge Arbeit für sone Kleinigkeit) siehe hier(die ganz unten, letzter Post)

31.05.2006 22:13 | geändert: 31.05.2006 22:14

4 Rudy

Die Sessionid heißt nicht immer sid, das ist eine PHP.ini-Einstellung. Default ist PHPSESSID.

So geht es überall:

session_name().'='.session_id()

31.05.2006 22:15

5 Isildur

Danke nochmal für die schnellen Antworten.
Sieht dann jetzt so aus
function getins($key, $value, $name, $class = '') {
         $url = "?";
         $keys = explode(":", $key);
	$values = explode(":", $value);//splitting the strings
         $keys[] = session_name();
         $values[] = session_id();
         $count = count($keys);
	$i = 0;
         while ($i < $count) {//as long as there are keys left to check
         	if(!array_key_exists($keys[$i], $_GET)) {//if the key doesnt already exist
         		$url .= trim($keys[$i])."=".trim($values[$i])."&";
         	}else{//else if the key already exists overwrite the value
         	        $array = array_keys($_GET);
         	        $pos = array_search($keys[$i], array_keys($_GET));//position of the existing element
         	       	$url .= $array[$pos] ."=". trim($values[$i])."&";//overwriting the old value
                 }
                 ++$i;
         }
         foreach($_GET as $k=>$v) {
                 if(!in_array($k, $keys)) {
       		$url .= $k."=".$v."&";
   		}
         }
         $link = "<a class='".$class."' href='".$url."'>".$name."</a>\n";
         return $link;
}

31.05.2006 22:21

6 Rudy

nicht schlecht, ich glaube aber das kannst Du billiger haben:

function getins($key, $value, $name, $class = '') {
    $keys = explode(":", $key);
    $values = explode(":", $value);//splitting the strings
    parse_str($_SERVER['QUERY_STRING'], $getvars);
    foreach($keys as $i => $k) {
      $getvars[$k] = trim($values[$i]);
    }
    $getvars[session_name()] = session_id();
    return "<a".(strlen($class) ? " class='$class'" : '')." href='?".http_build_query($getvars)."'>".$name."</a>\n";
}

Edit: Wenn Du die Funktion etwas anders einsetzt, dann reicht auch das:

function getins($vars, $name, $class = '') {
    parse_str($_SERVER['QUERY_STRING'].'&'.$vars.'&'.session_name().'='.session_id(), $getvars);
    return "<a".(strlen($class)? " class='$class'" : '')." href='?".http_build_query($getvars)."'>".$name."</a>\n";
}
Dann musst Du sie aber so benutzen:

getins('myvar1=hello&myvar2=hi', 'link');

Spart aber die explode und die Schleife - quick & dirty :)

31.05.2006 22:44 | geändert: 31.05.2006 23:42

7 Isildur

Mhh ja danke, werds mir in ner ruhigen Minute mal angucken.

Naja wie ich halt so bin war mir das noch nicht ganz gut genug. Ich übergebe die PHPSID nur per URL, wenn Cookies nicht erlaubt sind, dazu hab ich eine Konstante definiert die ich dann ganz einfach mit einer if Abfrage in der Funktion benutzen kann. Der Code dazu schaut so aus
<?php
ob_start();
session_start();
include "config.php";
if(!isset($_COOKIE['cookie_allow']) AND !isset($_GET['cookie'])) {
	setcookie("cookie_allow", "1", time()+3600);
         header("location: index.php".urlins("cookie","try"));
         ob_end_flush();
}elseif(!isset($_COOKIE['cookie_allow']) AND $_GET['cookie']=="try") {
	define("COOKIE_ALLOW", "0");
         include "index2.php";
}elseif(isset($_COOKIE['cookie_allow'])) {
	define("COOKIE_ALLOW", "1");
         unset($_GET['cookie']);
         include "index2.php";
}
?>

Die Erprobungsphase war noch zu kurz, dass ich ausschließen könnte, dass es zu Fehlern führt(zumal ob_start für mich Neuland ist) aber bisher funktioniert es prima.

01.06.2006 21:34 | geändert: 01.06.2006 21:34

8 Rudy

Bei der Cookie-Detection brauchst Du ob_start nicht. Die Pufferung brauchst Du nur, wenn Du alle Ausgaben abfangen willst, um damit vor der endgültigen Ausgabe an den Browser noch etwas anzustellen (Du kannst am Ende den Inhalt des Puffers, also alles, was bis dahin ausgegeben wurde, aber der Surfer effektiv noch nicht erhalten hat, mit $output = ob_get_contents(); in eine Variable lesen und den Puffer mit ob_end_clean() löschen. Der Inhalt der Variable ist die ganze Seite, über die kannst Du dann eine Funktion laufen lassen, etwas anhängen, etc - und sie am Ende ausgeben)

Für eine Cookie-Detection wäre es vielleicht nicht schlecht, gleich schon die session-id zu setzen
 setcookie(session_name(), session_id(), time()+3600, '/');
und danach darauf zu prüfen. Das spart dann später einiges, da Du die session-id direkt auslesen kannst.

Vielleicht interessiert dich auch dies: Fallback via Get

01.06.2006 21:49

9 Isildur

Naja zwei Dinge:
1.Wenn ich ob_start nicht benutze bekomme ich Problem mit den headern, das hab ich ausprobiert funktioniert nicht, so gehts aber einwandfrei
2.Die Sessioncookies werden doch eh schon von session_start() gesetzt; so habe ich die Session(die ja bei nicht erlaubten cookies von $_GET übergeben wird) und den Cookietest deutlicher voneinander getrennt, sehe da gerade nicht so ganz den Vorteil in deiner Version.

Ich mein auch so ists schon recht wenig Code...

Was fremden Code angeht bin ich sehr zurückhaltend, wenn ich das, was ich brauche auch selbst schreiben kann, ziehe ich eigenen Code vor, schlicht weil ich dann jede Zeile kenne und weiß was da passiert.

01.06.2006 21:55 | geändert: 01.06.2006 21:58

10 Rudy

Wenn Du Fehler bekommst, ohne die Ausgabepufferung einzuschalten, dann hast Du effektiv einen Fehler im Code, sprich es erfolgt eine Ausgabe an den Browser bevor Du setcookie verwendest (vielleicht in config.php?)

Ob Du den Cookie-Test nun über zwei zusätzliche Cookies oder über ein Session-Cookie machst sei Dir überlassen, war nur ein Tip.

01.06.2006 22:06