Seite 1 von 1
(Ideen zur) Sicherheit in PHP-Anwendungen
Verfasst: 22.11.2006, 20:20
von max_power
Bei Web-Anwendungen ist die Sicherheit ja generell ein wichtiges und gerade bei PHP-Anwendungen meist vernachlässigtes Thema. Aktuelles Beispiel sind die Diskussionen um das StudiVZ. Vielleicht können wir ja in diesem Thema mal allgemein auf Ideen und Probleme bei der Sicherheit eingehen.
Etwas, das ich immer wieder höre, ist das Problem, dass Bilder, die eigentlich privat sein sollen, von jedem mit der richtigen URL aufgerufen werden können. Bei niedriger bis mittlerer gewünschter Sicherheit ist das Problem, solange man die URLs der Grafiken nicht einfach raten kann, meiner Meinung nach zwar eher zu vernachlässigen, aber auf der anderen Seite sehe ich kein Problem darin, solche Zugriffe zu verhindern.
Anstatt sich einen Algorithmus auszudenken oder zu kopieren, der die Bildadressen verschlüsselt, kann man doch einfach die Grafik auf dem Server speichern, dann aber nicht direkt in der Webseite anzeigen, sondern dafür ein PHP-Skript schreiben:
Die Seite zeigt die Grafik an, deren Adresse ein PHP-Skript ist, dieses Skript bekommt eine ID der Grafik übergeben und kann anhand der User-Daten z.B. aus einem Cookie oder einer Session-ID bestimmen, ob die Grafik angezeigt werden darf. Ist dies der Fall, wird die URL der Grafik über die ID aus der Datenbank abgefragt und der Inhalt der Grafikdatei in die Grafikausgabe der PHP-Datei kopiert.
So sollte die URL doch für niemanden mehr sichtbar sein, man muss also über ein PHP-Skript gehen, das die Anzeige aber verhindern kann. Das einzige Problem dieser Lösung sehe ich darin, dass der Rechenaufwand für den Server höher ist, was doch aber die höhere Sicherheit wert ist.
Was meint ihr, sitzt der Teufel mal wieder im Detail, oder wäre dies eine sinnvolle Lösung?
Verfasst: 23.11.2006, 13:01
von Mic
Hm, irre ich mich, oder müsste der jeweilige Nutzer sich nicht einfach den Quelltext anschauen, um die ungeschützte Adresse der Grafik rauszubekommen? Zwar hat er sich zu diesem Zeitpunkt identifizieren müssen, aber ab dann würde ihm die einfache Grafik-URL reichen.
Spricht etwas gegen die Verwendung von .htaccess und .htpasswd?
Ansonsten fällt mir spontan die Möglichkeit ein für jeden User eine Session-ID anzulegen. Bei der Anmeldung des Nutzers könnte man einen Ordner dessen Namen die ID besitzt erstellen und alle schützenswerte Inhalte dorthin kopieren. Jeder Nutzer greift also auf "seine" Grafik zu und um eine Session-ID zu erhalten muss er sich jedes Mal anmelden.
Einzig allein das Löschen dieser Ordner müsste noch automatisiert werden.
Verfasst: 23.11.2006, 13:36
von john_doe
Mic hat geschrieben:Hm, irre ich mich, oder müsste der jeweilige Nutzer sich nicht einfach den Quelltext anschauen, um die ungeschützte Adresse der Grafik rauszubekommen?
Nein, wenn man z.B. das Bild direkt mit PHP ausliest und an den Browser schickt. Dann sieht der Browser/User nur den Namen des Scripts, und ohne ID usw. käme er nicht mehr an das Bild ran.
Was anderes würde mir jetzt auch nicht einfallen.
Verfasst: 23.11.2006, 14:55
von TentakelTommy
Seit wann ist "verstecken" Sicherheit?
Nur weil ich einen Vorhang vor die Haustür ziehe, kann ich die offen lassen und es passiert nichts?
Es existieren brauchbare Sicherheitsfunktionen - wer heutzutage noch auf den "Schutz" durch unbekannte Dateinamen glaubt, dem ist auch nicht zu helfen.
Und zu deiner Überlegung: PHP als Sicherheitsfunktion zu mißbrauchen ist mutig.

Die Daten müßten so liegen, daß der Webserver nicht drauf zugreifen kann, sondern nur das Skript via Stream auf Systemebene - sonst kann man ja einfach das Verzeichnis erraten. Dann muß noch sichergestellt sein, daß das Skript nicht durch ein Bild abgeschossen werden kann...
Fazit:
Mic hat Recht 
Man könnte ja die "Freunde" in die jeweilige .htpasswd schreiben und den Apachen das ganze erledigen lassen. Aber das wäre ja oldstyle und taugt somit nicht für das trendige Web2.0....
Verfasst: 23.11.2006, 16:02
von max_power
Na ja, ich möchte den bestmöglichen Mittelweg zwischen einfacher Nutzbarkeit und Sicherheit hinbekommen.
Wenn das StudiVZ z.B. als Beispiel nimmt:
Aktuell: Jeder kommt relativ leicht an jede Grafik -> viele Mitglieder, kaum Sicherheit (Schutz vor DAUs)
Mein Vorschlag: Wer an die Grafik möchte, muss den Dateinamen kennen oder eingeloggt sein, um an den Dateinamen zu kommen, muss man sich aber schon etwas einfallen lassen oder Sicherheitslücken im Script / in PHP nutzen -> viele Mitglieder, mittlere Sicherheit (Schutz vor der Allgemeinheit, kein Schutz vor Profis)
.htaccess: Die Seite wird deutlich unattraktiver und ist in ihrer jetzigen Art nicht mehr nutzbar -> ein Bruchteil der Benutzer, höchste Sicherheit
Ja, wenn es wirklich um Dokumente geht, die möglichst niemand sehen sollte (Zeugnisse, Nacktfotos von sich selbst

etc.), der es nicht darf, die aber nicht 100% geheim sind, dann muss man .htaccess nehmen, aber hier geht es ja nur darum, einen möglichst guten Grundschutz hinzubekommen.
Besteht vielleicht nicht noch die Möglichkeit, die Rechte auf dem Server so zu setzen, dass nur root und spezielle Skripte die Fotos lesen dürfen? Dann könnte auch jemand, der die Adresse kennt, nicht darauf zugreifen. Oder kann man in das Skript .htaccess-Zugriff integrieren? Dann müsste doch größtmöglicher Schutz gewährleistet sein.
Die Idee mit dem kopieren ist auch nicht schlecht. Wenn man irgendwie rausfinden kann, wann die Grafik beim Benutzer komplett geladen ist, könnte man sie ja direkt nach dem Seitenaufruf wieder löschen. Da könnte man mal vergleichen, welche Lösung ressourcenschonender ist.
Verfasst: 23.11.2006, 16:32
von TentakelTommy
"Nur spezielle skripte" geht nicht wirklich, da die Skripte ja alle entweder von www-run oder root gestartet werden. Kannst dir allerdings auch für jedes Skript einen User anlegen und danach chmoden
htaccess (bzw require valid user) ist ja schon ein Mittelweg zwischen Benutzerfreundlichkeit und Sicherheit.
Wirklich sicher wäre:
* User klickt Link auf Skript
* Skript schaut in seiner Datenbank, ob der user das darf
* Skript holt sich aus /dev/random ein paar Werte und bastelt daraus einen Datei- und Verzeichnisnamen. Das Bild wird dann in dieses Verzeichnsi gesteckt und per htpasswd geschützt.
* Skript schickt dem User eine gpg-verschlüsselte Mail mit URL.
* User geht zur URL und gibt sein Username und Passwort an.
Das ganze muß allerdings per Einschreiben/Rückschein erfolgen, weil man Mails ja abfangen kann und in 20 Jahren den gpg-Key gehackt hat
Was willst du eigentlich löschen? Du kannst doch wunderbar einen Dateistream einlesen und dir eine Webserver-Antwort drumrum basteln. Das ist dann alles nur im RAM/Cache und kann daher nirgendwo gelöscht werden
[add] was hast du eigentlich vor? at-vz.de?

Verfasst: 23.11.2006, 16:56
von td
HTTP-Auth geht auch ohne .htaccess, da muss man nur ein paar Header senden und die Antwort entsprechend auswerten. Dokuwiki macht das zum Beispiel so.
Verfasst: 23.11.2006, 17:40
von max_power
Ich habe nichts vor, ich frage mich nur, ob man PHP-Anwendungen nicht irgendwie auch vernünftiger (sicherer) machen kann, weil ich das Gefühl habe, dass PHP da eigentlich gar nicht so schlecht ist, wie sein Ruf, nur eben die meisten damit nicht richtig umgehen. Es ist quasi eine Art Evaluation und ein bisschen mehr Hintergrundwissen kann ja nie schaden.
Verfasst: 25.11.2006, 11:36
von TentakelTommy