Session per URL
David
- php
Hallo zusammen,
ich versuche gerade, den Login mittels sessions in PHP (Link) nachzubauen.
Alles klappt wunderbar, solange Cookies im Browser (Firefox 3) aktiviert sind. Wenn ich sie deaktiviere, funktioniert der Login nicht mehr, da die $_SESSION offensichtlich nicht übergeben wird. Nach dem Login wird man nicht eingeloggt ausgewiesen.
Laut den Informationen vom PHP Manual (Link) verstehe ich das so, dass ich nicht noch etwas ändern muss, wenn die Cookies beim client nicht funktionieren. Meine PHP Version ist 5.2.6.
Die Optionen session.use_trans_id = 1 und session.use_only_cookies = off sollten das meiner Meinung nach erlauben - siehe Auszug von phpinfo():
session.auto_start Off Off
session.bug_compat_42 Off Off
session.bug_compat_warn On On
session.cache_expire 180 180
session.cache_limiter nocache nocache
session.cookie_domain no value no value
session.cookie_httponly On On
session.cookie_lifetime 0 0
session.cookie_path / /
session.cookie_secure Off Off
session.entropy_file no value no value
session.entropy_length 0 0
session.gc_divisor 100 1000
session.gc_maxlifetime 10 1440
session.gc_probability 1 1
session.hash_bits_per_character 5 5
session.hash_function 1 1
session.name PHPSESSID PHPSESSID
session.referer_check no value no value
session.save_handler files files
session.save_path /tmp /var/lib/php5
session.serialize_handler php php
session.use_cookies On On
session.use_only_cookies Off On
session.use_trans_sid 1 0
Hier noch der relevante Code zum Login und Identifizieren:
login.php:
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
session_start();
$username = $_POST['username'];
$passwort = $_POST['passwort'];
$hostname = $_SERVER['HTTP_HOST'];
$path = dirname($_SERVER['PHP_SELF']);
// Benutzername und Passwort werden überprüft
if ($username == 'benjamin' && $passwort == 'geheim') {
$_SESSION['angemeldet'] = true;
// Weiterleitung zur geschützten Startseite
if ($_SERVER['SERVER_PROTOCOL'] == 'HTTP/1.1') {
if (php_sapi_name() == 'cgi') {
header('Status: 303 See Other');
}
else {
header('HTTP/1.1 303 See Other');
}
}
header('Location: http://'.$hostname.($path == '/' ? '' : $path).'/index.php');
exit;
}
}
[...]
auth.php:
<?php
session_start();
$hostname = $_SERVER['HTTP_HOST'];
$path = dirname($_SERVER['PHP_SELF']);
if (!isset($_SESSION['angemeldet']) || !$_SESSION['angemeldet']) {
header('Location: http://'.$hostname.($path == '/' ? '' : $path).'/login.php');
exit;
}
?>
Hat jemand von euch eine Idee, warum die session id ohne Cookies nicht weitergegeben wird? Geht das, ohne die SID überall einbauen zu müssen? Ich bin für jede Hilfe dankbar.
Beste Grüße
David
Hallo,
session.use_cookies On On
session.use_only_cookies Off On
session.use_trans_sid 1 0
Warum steht hier On On, Off On, 1 0 usw? In meiner php.ini gibt es keine derartigen Einträge. Allerdings kann dies eine Syntax sein, die mir nicht geläufig ist. Sollte es darüberhinaus nicht
session.use_cookies = 1
session.use_only_cookies = 0
session.use_trans_sid = 1
heißen?
Desweiteren will ich dir zwar nicht in deine Entscheidung dreinreden, SessionIDs per URLs zu übergeben, ich würde das aber nicht tun. Wenn so eine URL per Suchmaschine indiziert wird, könnte jemand diese Session "hijacken".
Und jemand, der seine Cookies deaktiviert, hat eben Pech gehabt. Die Sicherheit deiner Besucher sollte dir in diesem Fall einfach wichtiger sein, als irgendwelche Besucher, die meinen Cookies deaktivieren zu müssen.
Markus
Hallo Markus,
session.use_cookies On On
session.use_only_cookies Off On
session.use_trans_sid 1 0Warum steht hier On On, Off On, 1 0 usw? In meiner php.ini gibt es keine derartigen Einträge. Allerdings kann dies eine Syntax sein, die mir nicht geläufig ist. Sollte es darüberhinaus nicht
session.use_cookies = 1
session.use_only_cookies = 0
session.use_trans_sid = 1
heißen?
Das sind Auszüge der Ausgabe von phpinfo(), nicht der php.ini selbst. Jede Option hat einen lokalen und einen Haupt(Master)-Wert, deshalb zwei.
Desweiteren will ich dir zwar nicht in deine Entscheidung dreinreden, SessionIDs per URLs zu übergeben, ich würde das aber nicht tun. Wenn so eine URL per Suchmaschine indiziert wird, könnte jemand diese Session "hijacken".
Das Login-Skript sollte nur der Startpunkt sein. Ich wollte auch zusätzliche Mechanismen einbauen, delche die Sicherheit weiter ausbauen. Ich stimme dir völlig zu, dass die Weitergabe sehr unsicherer als per Cookie ist.
Und jemand, der seine Cookies deaktiviert, hat eben Pech gehabt. Die Sicherheit deiner Besucher sollte dir in diesem Fall einfach wichtiger sein, als irgendwelche Besucher, die meinen Cookies deaktivieren zu müssen.
Ja, aber leider sind das so viele Nutzer...
Für das Login-Skript werde ich es vielleicht wirklich nur bei Cookies lassen; auf jeden Fall würde es mich aber interessieren, was hier nicht läuft.
Beste Grüße
David
echo $begrüßung;
Hat jemand von euch eine Idee, warum die session id ohne Cookies nicht weitergegeben wird? Geht das, ohne die SID überall einbauen zu müssen? Ich bin für jede Hilfe dankbar.
Es gibt noch die Direktive url_rewriter.tags aus dem Abschnitt standard. Die enthält die Elemente, die um die SID ergänzt werden sollen.
Wenn bei dir Nicht-Cookie-Sessions global wegkonfiguriert sind (was aus dem rechten Wert hervorgeht)
session.use_cookies On On
session.use_only_cookies Off On
session.use_trans_sid 1 0
dann wird url_rewriter.tags vermutlich auch manipuliert worden sein.
echo "$verabschiedung $name";
Hallo dedlfix,
Es gibt noch die Direktive url_rewriter.tags aus dem Abschnitt standard. Die enthält die Elemente, die um die SID ergänzt werden sollen.
Wenn bei dir Nicht-Cookie-Sessions global wegkonfiguriert sind (was aus dem rechten Wert hervorgeht)
session.use_cookies On On
session.use_only_cookies Off On
session.use_trans_sid 1 0dann wird url_rewriter.tags vermutlich auch manipuliert worden sein.
danke für die Info.
Ich habe url_rewriter.tags auf a=href,area=href,frame=src,input=src,form=action
und sicherheitshalber arg_separator.output auf & gesetzt.
Allerdings ändert das leider nichts, ohne Cookies ist immer noch keiner Weiterkommen. Sind die url_rewrite.tags richtig für die header-Anweisung? Übersehe ich etwas?
Hi,
Sind die url_rewrite.tags richtig für die header-Anweisung?
Nein.
url_rewiter_tags gibt die Stellen im HTML an, an denen vor der Ausgabe des Outputs an den Browser die SID eingesetzt wird.
Wenn du per Location-Header irgendwohin umleiten, und dabei die SID als Fallback fuer den Fall, dass der Client keine Cookies akzeptiert, als GET-Parameter mitgeben willst, dann musst du das selber machen.
MfG ChrisB
Hallo ChrisB,
Wenn du per Location-Header irgendwohin umleiten, und dabei die SID als Fallback fuer den Fall, dass der Client keine Cookies akzeptiert, als GET-Parameter mitgeben willst, dann musst du das selber machen.
danke für die Info.
Dann hatte ich grundsätzlich etwas falsch verstanden, jetzt ist es klar.