phpbar.de logo

Mailinglisten-Archive

[php] 1/2 OT Session und Google Cache

[php] 1/2 OT Session und Google Cache

Yannik Hampe yannik at cipher-code.de
Son Dez 3 09:58:16 CET 2006



Ringo Großer wrote:
> Hallo Liste,
Hallo Ringo,
> 
> ich habe mit PHP einen geschützten Bereich gebaut, welcher
> über  eine Authorisierung per Session zu erreichen ist. Also der
> User gibt Benutzernamen und Passwort ein, beides wird gegen
> seinen Account in der DB geprüft, danach erfolgt der Login per
> Schalter in seiner Session.
> Im geschützten Bereich kann der User u.a. auch seinen Punktestand
> abrufen, eine Art Bonuspunkte für seine Teilnahme.
> 
> Nun hat mich ein Nutzer angesprochen, der seinen Namen per
> Google gesucht hat und dort aus dem Google Cache meine Seite
> angezeigt bekommt, und zwar aus dem geschützen Bereich und
> samt Informationen dieses Nutzers.
> Da stehen im Google Cache quasi im Klartext Informationen über den
> User (z.B. sein Punktestand), die eigentlich nur der User selbst nach
> einem Login sehen können sollte.
> 
> Ich suche nun nach irgendeiner Erklärung, wie das möglich ist.

Wahrscheinlich hat dein Benutzer einen Link, in dem seine Sessionid
srtand unwissentlich in irgendeinem Forum geposted und schwups hat ein
bot die gefunden und die session gab es zufällig noch.
Schau doch einfach mal in der access.log nach, wann die seite mit dieser
sessionid das erste mal aufgerufen wurde und wann sie vom googlebot
aufgerufen wurde, und was der googlebot auf deinem Server ggf. zuvor
aufgerufen hat.
du kannst übrigens mit den richtigen <meta>-Tags robots verbieten die
Seite zu durchsuchen. Ich weiss nur nicht, ob die sich daran halten...

> Des Weiteren listet der Google Cache einen Link in Verbindung mit
> meiner Seite, welcher auf einen Logout der selben Session-ID dieses
> Users hinweist. Den Link zum Logout kann man aber nur sehen, wenn
> man überhaupt eingeloggt ist. Einloggen kann man sich nur per
> Formular und indizierenden Robots werden wohl keine Formulare
> absenden und sich erst recht nicht erfolgreich einloggen können, weil
> die Zugangsdaten nicht bekannt sind.

Alles andere wäre auch schlimm :-). Wenn der bot den Link mit sessionid
irgendwo fand, muss auch der Logout-button da sein.
> Schlimm genug, dass Google solche Informationen für jeden zugänglich im
> Internet darstellt. Man denke mal nur an sensiblere Daten wie beim online
> Banking. Wobei ich hoffe, dass so etwas mit SSL-verschlüsselten URLs
> nicht passiert. Aber man kann doch nicht gleich jeden User-Bereich mit
> einem Zertifikat versehen. Das ging doch bisher auch mit ausschließlich
> PHP.

Woher soll google denn bitte wissen, dass es sich um einen geschützten
Bereich handelt. google kann nicht hellsehen ;-).
Selbst wenn google dies bei ssl nicht macht, solltest du dich nicht
darauf verlassen, denn google ist nicht die einzige Scuhmaschine im Web.
Ausserdem gibt es noch ganz normale Menschen, die den Link mit der
sessionid finden.
> 
> Also falls jemand irgendeine Idee hat, wie Daten aus einem nicht offiziellen
> Bereich einer Webseite, auf den wirklich nur ein User Zugriff haben kann,
> in den Google Cache gelangen können, ich wäre für Hinweise sehr dankbar.

Eine plausible Lösung habe ich ja geschrieben...
Frage ist, wie du das Problem löst.
Das Problem zusammengafasst ist:
Unbefugte erlangen Zugriff zuer Sessionid. Dazu gibt es mehrere
Möglichkeiten:
1. Am Bildschirm abtippen, wenn man neben der entsprechenden Person sitzt.
2. Mit ethereal oder vergleichbar, wenn man im gleichen Netzwerk sitzt.
3. Durch Trojaner auf dem Computer der Zielperson
4. Durch Unvorsichtigkeit des Benutzers (wenn der einen Link mit
sessionid veröffentlicht).

Gegen 1 und 4 hilft es cookies vorrauszusetzen, denn dann kommt die
sessionid nur im http-request vor, aber wird nichtmehr als URL in der
Adressleiste des Browsers proklamiert.
Gegen 2 hilft SSL. Aber das ist auch die einzige Attacke, die ssl
verhindert.
Gegen 3 bist du machtlos. Wenn sich irgendwer hinsetzt und es schafft
ein Progrämmchen auf dem Zielcomputer zu installieren, welches die
sessionid herausfindet und versendet (cookies sind einfach auf der
Platte und der Verlauf des Browsers bei ausgeschalteten Cookies genauso).

In deinem Fall handelt sich sich wahrscheinlich um 4.
Cookies könnten das zwar verhindern, dafür hast du mit cookies andere
Probleme. Zum Beispiel kannst du den Benutzer dazu bringen eine andere
Seite zu öffnen während er eingeloggt ist. Dann kann diese Seite den
Benutzer dazu bringen auf einen Link zu klicken, der eine Seite in
deinem geschützten Bereich ansteurt. Ganz ohne deine sessionid zu
kennen, denn die schickt der Browser praktischerweise automatisch mit.
Mit ajax macht das ganze noch mehr Spass...
Ob das mit ajax funzt habe ich allerdings noch nie getestet.

Im Internet Explorer gibt (oder gab es zumindest) auch ein paar
Sicherheitslücken, mit denen man mit VBScript Cookies anderer Seiten
auslesen kannst.
So einfach kommst du an die sessionid nicht dran, wenn du nur mit ssid
in der URL arbeitest.

Fazit: Cookies sind auch nicht sicherer ;-).

Es gibt aber noch eine Methode, wie du dich vor den Auswirkungen des
Bekanntwerdens der sessionid schützen kannst:
Speicher die IP!
Mit ip2long() kannst du die ip des Benutzers bequem in einem
Longint-Feld einer DB (oder sonstwo) speichern und dann bei jedem Aufruf
prüfen, ob die ip sich geändert hat.
Nachteil: Wenn der Nutzer eine der berüchtigten in Deutschland üblichen
24h-Trennungen hat, dann kann er sich direkt ein einloggen.
Ausserdem bekommst du Probleme mit anonymizern, die ständig den proxy
wechseln.
Dann könntest du noch den User-Agent (oder einen substring daraus)
speichern und vergleichen. Der googlebot hat nämlich seinen eigenen
User-Agent. Ausserdem darf es dir ruhig verdächtig vorkommen, wenn der
Benutzer plötzlich den Browser wechselt. Das ist dann doch sehr
unwahrscheinlich. Allerdings ist auch diese Methode nicht wirklich
verlässlich: Wenn ein anderer Benutzer den Link findet und zufällig den
gleichen Browser hat (wahrscheinlich!) dann hat die Methode schon wieder
nichts gebracht.
> 
> Einen schönen ersten Advent wünsche ich noch, Ringo. 
> 

Yannik

php::bar PHP Wiki   -   Listenarchive