Raik: Binärdaten-Kodierung bei Upload via multipart/form-data

Hallo!

Ich habe gerade ein Hobbyprojekt angefangen, bei dem ich mit AutoIt3 einen Uploader für Bilder zu Dateihostern schreibe.
Da ich dazu den Request "raw" zusammenbauen muss, habe ich vorab mal den gleichen upload vom browser aus gemacht und das mit wireshark mitgesnifft, um zu sehen, wie die gesendeten Raw-Daten aussehen.
Hab dann probehalber mal das Bild aus der capture.bin extrahiert und wieder nach *.jpg umbenannt. Das Bild lässt sich aber nicht mehr öffnen, anscheinend wird die Datei doch nicht unverändert in den Upload eingefügt, aber woran liegt diese Veränderung?

freundl. Grüsse aus Berlin, Raik

  1. Hello Raik,

    schön, von Dir mal ein Lebenszeichen zu empfangen :-)

    Ich habe gerade ein Hobbyprojekt angefangen, bei dem ich mit AutoIt3 einen Uploader für Bilder zu Dateihostern schreibe.
    Da ich dazu den Request "raw" zusammenbauen muss, habe ich vorab mal den gleichen upload vom browser aus gemacht und das mit wireshark mitgesnifft, um zu sehen, wie die gesendeten Raw-Daten aussehen.
    Hab dann probehalber mal das Bild aus der capture.bin extrahiert und wieder nach *.jpg umbenannt. Das Bild lässt sich aber nicht mehr öffnen, anscheinend wird die Datei doch nicht unverändert in den Upload eingefügt, aber woran liegt diese Veränderung?

    was hast Du denn da mitgeschnitten? Die kompletten Datenpakete? Die enthalten dann doch auch den gesamten Overhead von TCP/IP...

    Oder habe ich das jetzt falsch verstanden?

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hallo Tom :-)

      schön, von Dir mal ein Lebenszeichen zu empfangen :-)

      ebenso, grüsse zurück :-)

      was hast Du denn da mitgeschnitten? Die kompletten Datenpakete? Die enthalten dann doch auch den gesamten Overhead von TCP/IP...

      siehe meine Antwort an Rolf.

      freundl. Grüsse aus Berlin, Raik

  2. moin,

    Hab dann probehalber mal das Bild aus der capture.bin extrahiert und wieder nach *.jpg umbenannt. Das Bild lässt sich aber nicht mehr öffnen, anscheinend wird die Datei doch nicht unverändert in den Upload eingefügt, aber woran liegt diese Veränderung?

    Mit enctype="multipart/form-data" sendet der Browser eine Multipart-Message. Die "Teile" also die Bytes werden dabei nicht verändert, sondern vermittels einer Boundary (Trennlinie) und Leerzeilen voneinander getrennt als Message-Body gesendet. Die Boundary sendet der Browser im Requestheader mit, damit der serverseitige Parser die einzelnen Komponenten wieder herstellen kann. Jeder Part einer solchen Multipart-Message enthält neben der Boundary auch weitere zusätzliche Header u.a. mit Angaben zu Content-Type jeder einzelnen Komponente.

    Die capture.bin enthält außerdem die HTTP-Request-Header. Ob die capture.bin genauso aufgebaut ist, wie die Multipart-Message, die serverseitig aus STDIN gelesen wird, kann ich allerdings nicht sagen. Das hängt auch davon ab, welchen Filter Du in Wireshark gesetzt hast und ob Du tatsächlich nur diesen, den Request entsprechenden TCP-Stream eingefangen hast.

    Das "Mitschneiden" von Voice (Telefonie, Internetradio) mit Wireshark ist jedenfalls sehr wohl möglich, wenn der Filter stimmt, klappts auch mit der Wiedergabe  ;-)

    Schönen Sonntag,
      Horst Hacke

    1. Hallo Rolf!

      Vielen Dank, den ungefähren Aufbau kannte ich schon aus meinem "VCard erzeugen und per Email versenden"-Projekt :-)

      Die "Teile" also die Bytes werden dabei nicht verändert, ...

      Das dachte ich eigentlich auch.
      Beim Öffnen mit Notepad waren die Header auch da.
      Als ich die rausgelöscht und nur die Binärdaten des Bildes übrig gelassen hab, und umbenannt in *.jpg, konnte sie allerdings nicht geöffnet werden. Die Grösse der Datei stimmte exakt mit dem ursprünglichen Bild überein.
      Im Hexeditor war zu sehen, dass u.a. 0x00 bytes in 0x20 umgewandelt wurden.

      Ob die capture.bin genauso aufgebaut ist, wie die Multipart-Message, die serverseitig aus STDIN gelesen wird, kann ich allerdings nicht sagen. Das hängt auch davon ab, welchen Filter Du in Wireshark gesetzt hast und ob Du tatsächlich nur diesen, den Request entsprechenden TCP-Stream eingefangen hast.

      hab nur auf http.request.method (POST) und http.host gefiltert. Hab die "Reassembled TCP Segments" exportiert, da sollte genau der Request sein.

      freundl. Grüsse aus Berlin, Raik

      1. Hallo,

        Das dachte ich eigentlich auch.
        Beim Öffnen mit Notepad waren die Header auch da.
        Als ich die rausgelöscht und nur die Binärdaten des Bildes übrig gelassen hab, ...

        aha, dann nehme ich an, dass Notepad dabei schon die Daten verstümmelt hat.

        Im Hexeditor war zu sehen, dass u.a. 0x00 bytes in 0x20 umgewandelt wurden.

        Vermutlich deshalb, weil Notepad mit 0x00 nichts anfängt und sie deshalb durch Spaces ersetzt.
        Mach das Abscheiden der Header bzw. das Isolieren des Nutzinhalts lieber auch mit dem Hex-Editor, dann sollten die Restdaten auch unverändert bleiben.

        Ciao,
         Martin

        --
        Ungeschehene Ereignisse können einen katastrophalen Mangel an Folgen nach sich ziehen.
          (Unbekannter Politiker)
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Hallo Martin!

          Vermutlich deshalb, weil Notepad mit 0x00 nichts anfängt und sie deshalb durch Spaces ersetzt.
          Mach das Abscheiden der Header bzw. das Isolieren des Nutzinhalts lieber auch mit dem Hex-Editor, dann sollten die Restdaten auch unverändert bleiben.

          Das ist es! :-)
          Danke, damit weis ich, dass ich nicht versehentlich fehlehafte Daten sende.

          freundl. Grüsse aus Berlin, Raik

      2. Halo Raik,

        Vielen Dank, den ungefähren Aufbau kannte ich schon aus meinem "VCard erzeugen und per Email versenden"-Projekt :-)

        Jow, der Message-Body einer MIME-Mail sieht ganz ähnlich aus, mit dem Unterschied, dass eine Binary dann base64-codiert ist und die Texte ggf. Quoted-Printable oder auch base64 (steht dann in den Headers der Einzelkomponenten, mehr für die Mitleser...).

        Alles keine Hexerei... siehe Anm. untenstehend.

        Beim Öffnen mit Notepad waren die Header auch da.

        Schließe mich Martins Antwort an ;)

        Anm.: Wenn Du was "Eigenes" bauen möchtest, etwa ein "Binary-Stream-Up" an den Server, dann musst Du Dich nicht an den ekelhaften Enctype="multipart/form-data" halten.

        HTTP ist durchaus zum Übertragen von reinen Binaries geeignet, die serverseitig bytegenau aus STDIN gelesen werden können bei einem POST. Das erfordert natürlich einen speziellen User-Agent, welcher in den Body nur die reine Binary steckt mit der exakten Angabe Content-Length (im HTTP-Request-Header).

        Alle anderen Angaben, die zu einem solchen Request gehören, kommen in eigene Request-Header, etwa Angaben dazu, was mit der Binary gemacht werden soll.

        Ich habe sowas mal vor ein paar Jahren zum Updaten meiner Website entwickelt und ich bin froh, dass ich das gemacht habe, das Modul ist fertig und funktioniert einwandfrei ;)

        Viel Spaß weiterhin,
        Hotti