Session-ID - Sicherheitslücke?
Hans
- php
0 Cheatah0 Ulf
0 Christian Seiler
Moin,
Ich habe eine personalisierte Seite, die mit Sessions funktioniert:
Der USer loggt sich mit Name und PW ein und bekommt eine Session-ID zugewiesen, die bei jeder Datei hinten angehängt wird. (z.B. menu.php?session=23423kjk...)
Wenn jetzt ein anderer User am anderen Rechner diese Session wüsste und sie manuell an den Dateinamen hängen würde, wäre er dann (sofern die Session noch nicht verfallen ist) als der erste USer ingeloggt?
Danke & Mfg
Hans
Hi,
Wenn jetzt ein anderer User am anderen Rechner diese Session wüsste
... z.B. weil er sie durch den Referer in seinen Logfiles gefunden hat ...
und sie manuell an den Dateinamen hängen würde, wäre er dann (sofern die Session noch nicht verfallen ist) als der erste USer ingeloggt?
Ja.
Cheatah
Dafür gibt es doch logout-Buttons und session_destroy()!!!!!!!!!!
Hallo Hans,
Wenn jetzt ein anderer User am anderen Rechner diese Session wüsste und sie manuell an den Dateinamen hängen würde, wäre er dann (sofern die Session noch nicht verfallen ist) als der erste USer ingeloggt?
Ja. Deswegen lässt man die Session a) recht schnell verfallen und b) verwendet man einen möglichst großen Wertebereich für Session-IDs. (damit das erraten schwer fällt) Warum glaubst Du wohl, werden die nicht von 0 hochgezählt? ;-)
Theoretisch gesehen ist so etwas möglich und nennt sich "session hijacking". Meistens wird die Session-ID dabei jedoch nicht erraten, sondern irgendwoher bekommen. (Logfiles mit Referer, nicht geschlossene Browserfenster an öffentlichen Terminals, etc.)
Viele Grüße,
Christian
Hi,
wie könnte ich sowas unterbinden? Ich meine viele Webportale (acuh bekannte, z.B. web.de) benutzen Session nach diesem System...
Sollte ich auch immer die IP prüfen?
Wie lange sollte eine Session denn aktiv sein und wie kann ich das über PHP einstellen (vielleicht mit "ini_set")?
Danke,
Hans
Hi!
wie könnte ich sowas unterbinden?
100%ig kannst Du es nicht unterbinden.
Ich meine viele Webportale (acuh bekannte, z.B. web.de) benutzen Session nach diesem System...
Ja, und die fordern die User teilweise recht aufdringlich auf sich am Ende auszuloggen, eben aus diesem Grund, denn wenn sich ein User ausloggt, kannst Du die Session löschen und dann bringt die SessionID nichts mehr.
Sollte ich auch immer die IP prüfen?
nein, denn die kann sich während der Session verändern (z.B. wenn eien Verbindung zwischendurch getrennt wird...)
Eine leichte Verbesserung kannst Du erzielen wenn Du die Verwendung von Cookies zur Übergabe der SessionID erzwingst, denn Cookies werden normalerweise nicht in dem Maße geloggt wie Referrer. Nur akzeptiert nicht jeder User Cookies...
Wie lange sollte eine Session denn aktiv sein
das kommt auf Deine Anwendung an, das musst Du selbst wissen. Sie solte möglichst kurz sein, aber nicht so kurz dass andauernd unbescholtene User rausfliegen. Musst halt einen Mittelweg finden.
und wie kann ich das über PHP einstellen (vielleicht mit "ini_set")?
genau. Im Manual steht mehr dazu: http://de3.php.net/manual/de/ref.session.php#session.configuration
Grüße
Andreas
Hallo Hans,
wie könnte ich sowas unterbinden?
Erraten: Das kannst Du nicht. Allerdings: Eine PHP-Session-ID ist ein MD5-Hash. Ein MD5-Hash ist 128 bit groß; d.h. Du hast 2^128 = 340282366920938463463374607431768211456 verschiedene Möglichkeiten. Das dauert dann schon, das zu erraten.
Gegen Leute, die sich vergessen auszuloggen, kann man allerdings nichts tun. Höchstens das Timeout verkürzen, was dann andere aber wieder verärgern wird...
Gegen das Auftauchen der Session-ID im Referer haben sich Leute auch schon Dinge ausgedacht. Du musst im Prinzip ein Script dazwischenschalten:
http://domain.test/redirect.php?url=http%3A%2F%2Fwww.example.org%2F
Bsp:
Ich befinde mich in: http://domain.test/index.php?PHPSESSSID=abcde
Dort ist dann ein Link auf http://domain.test/redirect.php?url=http%3A%2F%2Fwww.example.org%2F.
Falls use_trans_sid *deaktiviert* ist, sollte redirect.php ganz normal auf http://www.example.org/ weiterleiten, da nichts durchsickern kann. Falls aber use_trans_sid *aktiviert* ist, wird im Browser http://domain.test/redirect.php?url=http%3A%2F%2Fwww.example.org%2F&PHPSESSID=abcdef statt http://domain.test/redirect.php?url=http%3A%2F%2Fwww.example.org%2F aufgerufen. (PHP denkt zu sehr mit) Daher muss redirect.php automatisch erkennen, ob $_GET["PHPSESSID"] existiert und wenn ja, soll es nochmal auf http://domain.test/redirect.php?url=http%3A%2F%2Fwww.example.org%2F weiterleiten, damit ganz sicher nichts im Referer auftaucht. redirect.php selbst sollte wirklich nur die Weiterleitung realisieren und keine Session starten, sonst könnte trans_sid ja wieder greifen.
Prinzipiell könnte redirect.php so aussehen:
<?php
if (isset ($_GET["PHPSESSID"])) {
Header ("Location: http://".$_SERVER["HTTP_HOST"].$_SERVER["PHP_SELF"]."?url=".urlencode ($_GET["url"]));
exit;
}
Header ("Location: " . $_GET["url"]);
?>
Sollte ich auch immer die IP prüfen?
Nein, sonst sitzen Dir die AOL-User im Nacken. (die gehen nämlich alle über eine Art Proxy-Cluster oder so etwas ähnliches hinaus und ihre IP kann innerhalb von Sekunden wechseln - so heißt es zumindest)
Wie lange sollte eine Session denn aktiv sein
So kurz wie möglich, so lange wie nötig. ;-)
und wie kann ich das über PHP einstellen (vielleicht mit "ini_set")?
ini_set, allerdings vor session_start(), sonst klappt es teilweise nicht.
Viele Grüße,
Christian