Problem mit IsPathRooted

  • Hallo Freunde

    Ich arbeite mit ASP.NET 2.0. Ich habe dabei ein Problem unter Firefox (Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2). Es geht um FileUpload.

    Als Benutzer meiner Web Site wähle ich die zu downloadende Datei aus der vorgesehenen Dialog Box aus - es ist als Beispiel "C:\Documents and Settings\sl\My Documents\My Pictures\01.jpg" - so wird es mir auch in der Dialog Box quittiert.

    Im Programm prüfe ich dann folgendes:

    ***

    FileUpload fileToUpload = xxx;

    if (System.IO.Path.IsPathRooted(fileToUpload.PostedFile.FileName) != true) ...

    // die Datei ist NICHT absolut adressiert - ich lasse Upload daher aus Sicherheitsgründen nicht zu, den ich kann die allfällige Quelle des allfälligen Uebels nicht lokalisieren !

    ***

    Unter IE erhalte ich RICHTIGERWEISE als Antwort 'true' - und wenn ich die Variable fileToUpload.PostedFile.FileName inspiziere, so enthält diese korrekt "C:\\Documents and Settings\\sl\\My Documents\\My Pictures\\01.jpg"

    Unter Firefox jedoch erhalte ich FAELSCHLICHERWEISE als Antwort 'false' - und fileToUpload.PostedFile.FileName enthält lediglich "01.jpg" !!! Das scheint mir falsch !!! Wenngleich hier natürlich fraglich ist, was mit ".FileName" gemeint ist !!! Aber mir scheint der ganze Pfad schon sinnvoll, sonst ist diese Prüfung auf ...IsPathRooted... ja gar nicht möglich !!!

    ***

    Damit kann ich aus Sicherheitsgründen NICHT leben - ich kann Firefox SO NICHT ZULASSEN für meine Benutzer ! Da Firefox jedoch ein toller Browser ist - und da ich erstmal annehme das Problem sei irgendwo bei mir oder so - oder dass es allenfalls eine Umgehungslösung gibt - so möchte ich die Gurus um Rat bitten.

    Frage:

    - mach ich was falsch, was, wie muss ich es anders machen

    - falls nein, gibt es eine Umgehungslösung, wie sieht die aus

    - falls nein, wann ist mit einem verbesserten Verhalten von Firefox zu rechnen

    Besten Dank für rasche Hilfe

    simmoz (ich moz ja nie - ich frag nur !)

  • Ich verstehe dein Problem nicht. IsPathRootet prüft ja in dem Fall darauf, ob der Browser dir jetzt den kompletten Pfad sendet oder nicht.

    So wie es bei dir aussieht, sendet der IE dir

    IsPathRooted=True
    und als Pfadnamen
    C:\bla\bla.jpg (zum Beispiel)

    und der Firefox sendet dir


    IsPathRooted=False
    und als Pfadnamen
    bla.jpg (zum Beispiel)

    Soweit ist doch alles in Ordnung. IsPathRooted enthält den korrekten Wert (True, wenn der vollständige Pfad da ist, False wenn nicht).
    Der einzige Unterschied ist eben, dass der IE dir den gesammten Ordner mitsendet und der Firefox nicht. Hier ist zwar beides wohl richtig, aber das vom Firefox erscheint mir aus Datenschutzgründen sicherer, denn so kann der Webseitenautor nicht deine/meine Ordnerstruktur lesen, die ihn eigentlich auch garnichts angeht.

    Ich verstehe nicht ganz, was an der Methode vom Firefox unsicher oder falsch sein soll.

  • Hallo JonHa

    Danke für Deine Antwort, welche ich verstehe - aus DEINER Optik.

    Aus MEINER Optik möchte ich - gerade als Webseitenautor - sicher sein dass ***UPLOAD*** Daten aus einer sichern und vorallem NACHVOLLZIEHBAREN Quelle kommen - UND NICHT ***RELATIV*** ADRESSIERT SIND !

    Als DAS verstehe ich das Bit 'IsPathRooted' - respektive den Sinn und Zweck dieses Bit. Der Benutzer hat ja auch wirklich eine 'Rooted' Auswahl vorgenommen - und nicht ***irgendwo*** quasi virtuell aufgesetzt.

    "C:\bla\bla.jpg" ist ja nicht obligatorisch auch "Rooted" - es kann ja z.B. ein virtueller Punkt sein, welcher physikalisch nicht auf Root Ebene aufsetzt. Auf dem Web Server kann ich das NICHT rausfinden, auch wenn ich den ganzen Pfad vom Client/Browser bekomme. Einzig der jeweilige Client/Browser kann das wissen - und mir auf dem Web Server mitteilen - mit eben diesem Bit 'IsPathRooted'.

    Wie DU die Firefox Interpretation verstehst, macht für mich KEINEN Sinn - denn aufgrund des FileNames "bla.jpg" kann jeder auf dem Web Server sehr gut selbst erkennen, dass da jegliche Root-Erkennungs-Komponente fehlt; IsPathRooted wäre somit also überflüssig.

    - Hast Du ev. eine Quelle, wo ich die genaue Definition von IsPathRooted nachschlagen kann ?

    - Hast Du eine Idee, wie ich mein latentes Problem lösen kann ?

    - Liege ich völlig falsch ?

    Besten Dank, simmoz

  • Zitat von simmoz


    Aus MEINER Optik möchte ich - gerade als Webseitenautor - sicher sein dass ***UPLOAD*** Daten aus einer sichern und vorallem NACHVOLLZIEHBAREN Quelle kommen - UND NICHT ***RELATIV*** ADRESSIERT SIND !


    Worin liegt der Sicherheitsgewinn beim Uploaden auszulesen, aus welchem Ordner die Datei hochgeladen wurde? Wenn du nur Uploads aus einem bestimmten Ordner akzeptieren würdest, würde ich mir halt den Ordner anlegen und die Datei, die ich hochladen will, da rein packen.

    Zitat


    Als DAS verstehe ich das Bit 'IsPathRooted' - respektive den Sinn und Zweck dieses Bit. Der Benutzer hat ja auch wirklich eine 'Rooted' Auswahl vorgenommen - und nicht ***irgendwo*** quasi virtuell aufgesetzt.


    IsPathRooted ist (meines Wissens) nur eine ASP-Funktion, die überprüft, ob in dem Pfad ne Laufwerksangabe o.ä. enthalten ist. IsPathRooted hat nichts mit dem eigentlichen Dateiupload zu tun.

    Zitat


    "C:\bla\bla.jpg" ist ja nicht obligatorisch auch "Rooted" - es kann ja z.B. ein virtueller Punkt sein, welcher physikalisch nicht auf Root Ebene aufsetzt. Auf dem Web Server kann ich das NICHT rausfinden, auch wenn ich den ganzen Pfad vom Client/Browser bekomme. Einzig der jeweilige Client/Browser kann das wissen - und mir auf dem Web Server mitteilen - mit eben diesem Bit 'IsPathRooted'.


    Meines Wissens ist "C:\bla\bla.jpg" in jedem Fall "Rooted". Es wäre mir neu, wenn der Browser übermitteln würde, ob der Pfad gerooted ist, das liest der Webserver eigentlich nur anhand des "Aussehens" des Pfades aus.

    Zitat

    Wie DU die Firefox Interpretation verstehst, macht für mich KEINEN Sinn - denn aufgrund des FileNames "bla.jpg" kann jeder auf dem Web Server sehr gut selbst erkennen, dass da jegliche Root-Erkennungs-Komponente fehlt; IsPathRooted wäre somit also überflüssig.


    IsPathRooted _ist_ ziemlich überflüssig. Der Sinn besteht vermutlich darin vor dem ablegen der Datei auf dem Server entsprechende überflüssige Pfad-Teile abschneiden zu können.

    Zitat

    - Hast Du ev. eine Quelle, wo ich die genaue Definition von IsPathRooted nachschlagen kann ?

    Nein, ich kenne mich nur wenig mit ASP aus und zuverlässige Referenzen sind mir nicht bekannt. Du könntest es allerdings mal in der knowledge-base von microsoft versuchen.

    Zitat

    - Hast Du eine Idee, wie ich mein latentes Problem lösen kann ?


    Wie gesagt, ich sehe da kein Problem.

    JonHa

  • Hallo JonHa

    Nochmals Danke für Deine Antwort, welche ich verstehe - und deren Optik ich mich mittlerweilen anschliessen MUSS.

    Meine Schlussfolgerungen:

    A) Sicherheitsgewinn: aus rein haftungstechnischer Sicht macht es einen ERHEBLICHEN Unterschied aus, ob der Benutzer etwas NACHWEISBAR VON SEINEM COMPUTER auf einen Web Server uploaded, oder ob er sich hinter IRGENDWAS VIRTUELLEM, SPAETER NICHT MEHR NACHWEISBAREM verstecken kann (es ginge da natürlich um zweifelhafte Inhalte).

    B) Du hast völlig recht - ich habs mittlerweilen nachgeprüft - Microsoft prüft lediglich ob da irgenwie ein Laufwerkbuchstabe vorhanden ist ! Wenn ich z.B. eine Datei anwähle ab einem gemounteten Neztwerk-Laufwerk, so vermeldet 'IsPathRooted' unter IE ganz frech 'true', trotzdem DIES UEBERHAUPT NICHT STIMMT ! Es geht also bei diesem Bit wirklich nur um das "Aussehen" des Pfad Namens - und nicht um Tatsächlichkeit.

    C) Ich habe auch keine Quellen gefunden die 'IsPathRooted' genauer definieren

    D) Somit KANN mein Sicherheits Problem gar nicht gelöst werden und ich (respektive meine Web Anwendung) muss damit leben - sowohl beim Firefox, als auch beim IE. Letztendlich erscheint mir die Bit Aussage des Firefox noch die bessere und vorallem ehrlichere, denn sie führt mich nicht aufs Glatteis so wie der IE !

    Besten Dank jedenfalls für die professionelle und rasche Hilfe, simmoz

  • Zitat von simmoz


    A) Sicherheitsgewinn: aus rein haftungstechnischer Sicht macht es einen ERHEBLICHEN Unterschied aus, ob der Benutzer etwas NACHWEISBAR VON SEINEM COMPUTER auf einen Web Server uploaded, oder ob er sich hinter IRGENDWAS VIRTUELLEM, SPAETER NICHT MEHR NACHWEISBAREM verstecken kann (es ginge da natürlich um zweifelhafte Inhalte).

    Nur als Nachtrag: Sich vor so etwas zu schützen ist einfach unmöglich. Erstens weiß meistens nicht einmal der Browser von was für einem Laufwerk er was hochlädt. Dem ist völlig egal, ob das ein Netzlaufwerk, eine Diskette, eine USB-Festplatte oder ein emuliertes CD-ROM-Laufwerk ist. Und selbst wenn der Browser das erkennen und mitsenden würde, könnte man ja einfach den Browser umprogrammieren bzw. einen selbst programmieren, der dann eben falsche Angaben sendet.