PHP: dateien zwischenlagern ein Sicheitsrisiko und aufwändig?



  • Hallo,

    wir haben hier einen Win2003 Server IIS mit PHP 5.1 am laufen (A).
    Daneben gibt es eine andere Kiste mit einem Tomcat drauf (B).

    B macht nichts anderes als PDF-Dokumete auf Anfrage zur Verfügung zu stellen.
    In der Art "HTTP:\\x.x.x.x\123445.ABCDE.pdf" können diese dort aufgerufen werden.

    Nun ist so das wir über Server A den Kunden angebunden haben, da B in einem vom Kunden nicht erreichbaren Netz steht, das aber für A erreichbar ist.
    Nun hatten wir einen externen Entwickler angeheuert der in PHP auf A die sozusagen umgeleiteten PDFs in eine Weboberfläche auf A integrieren sollte, inklusive Download-Link.

    Der hat uns jedoch irgendwas erzählt, von wegen das sei nicht so einfach mit PHP auf Windows-Dateisystem und da gäbe es Sicherheitsrisiken und blabla.
    Jedenfalls wollte es aufeinmal mehr Stunden als die vereinbarten 2 Stunden haben.

    Das kam mir komisch vor. Ich hab mich dann mit meinen sehr rudimentären Kenntnissen von PHP hingesetzt und mich mir Hilfe von PHP.net in < 1 Stunde eine einfache Lösung hingebastelt(bis auf die PDF-Dardstellung und den Download-Link gab es die Oberfläche schon).

    Das tut wie folgt:
    Kunde fragt in seinem Browser eine DocID an, das PHP-Skript schaut in einen lokalen PDF zwischenspeicherpfad ob die PDF-Datei mit der DocID dortdrin liegt,
    falls nein wird das PDF mit der PHP-Funktionen "copy" von B auf A in diesen Zwischenspeicherpfad reinkopiert.
    copy('HTTP:\\x.x.x.x\'.DocID.'.ABCDE.pdf', '.\\PDF_temp\\'.DocID.'.ABCDE.pdf');
    Dann wird einem <input> Submit-Button einfach im "onClick" eine Javescript "window.open('.\PDF_temp\'.$DocID.'.ABCDE.pdf')" aufgerufen.

    Fertig, funktioniert. Wo ist da jetzt der große Aufwand, wo das Sicherheitsproblem? Was ich nur sehe ist: der Kunde könnte theoretisch beliebige Dokumente aus dem PDF_temp abrufen, aber das darf er sowieso.
    Für PDF_temp -Pfad schreibe ich noch ein kleines Script das alles löscht was länger als eine Woche nicht angefasst wurde (einen Abruf wird eh schon in einer Datenbank erfasst).

    Will uns der PHP-Fuzzi übern Tisch ziehen, ist er unfähig oder übersehe ich was?



  • Er könnte alle Dokumente, die auf dem Webserver x.x.x.x erreichbar sind, einsehen (z.B. durch $DocID = '../../irgendwas.cfg').



  • Naja, für den Fall könnte man aber einen kurzen Check einbauen, der prüft, ob die DocID gültig ist und, ob der zusammengebastelte Pfad gleich dem Temp-Pfad ist, oder so ähnlich.



  • Natürlich, jede Sicherheitslücke ließe sich schließen! Ich wollte nur aufzeigen, dass es - so wie das System oben beschrieben ist - eben doch nicht ganz so unbedenklich ist 😉



  • warum keinen reverse proxy konfigurieren, der vorher eine auth durchführt - das sollte ein guter admin recht schnell hinbekommen (und es braucht keinen php code 🙂



  • Deine Methode ist bezüglich Performance gut, da ein einmaliger Kontakt zwischen B & A die PDFdaten bereit stellt.
    Hier sollte man sich überlegen, ob diese Daten dann von allen Kunden einsehbar sind.

    Um die Sicherheit zu gewährleisten ist es wichtig, das B den kopiervorgang durchführt. Dabei stelle A an B einen Request, der die Bereitstellung der PDF-Datei anfragt.
    Um hierbei wirklich Sicherzugehen, könnte eine Konfigurations-datei bestimmte PDF-Dateien auffassen, die von A angefordert werden dürfen.

    Eine Weitere Möglichkeit wäre, die PDF-Dateien immer auf A zu lokalisieren. B Überprüft Sequenziell(automatisch z.B. alle 24 Stunden), ob sich die PDF-Dateien verändert(Größe,Inhalt,..etc) haben, wodurch ein Update von B auf A erfolgt.
    Somit hat A keine Möglichkeiten über B ungewollten Informationen anzufragen.



  • Also,
    inzwischen gibt es noch einen Mustercheck - rein numerisch - für die DocID.
    Ansonsten hab ich so gelassen.
    danke.


Log in to reply