hotti: Boundary in multipart/form-data

Hallo zu später Stunde,

wie wir wissen, werden die Komponenten einer Multipart-Message mit Enctype="multipart/form-data" durch eine Boundary getrennt, die der Browser erzeugt und dem POST-Request Header mitgibt, z.B.:

CONTENT_TYPE multipart/form-data; boundary=---------------------------41184676334

Wie groß ist denn die Wahrscheinlichkeit, dass auch die Datei, die gewöhnlich über <input type="file"> angehängt wird, eben genau diese Boundary als Bytefolge auch zum Inhalt hat?

Zugegeben, die Frage ist ein bischen doof, weil meistens Bilddateien o.ä. hochgeladen werden, aber möglich ist es und das Resultat wäre eine inkonsistente "Datenstruktur". Ist sowas überhaupt schonmal passiert?

Bitte klärt mich mal auf,
Hotti

--
Wenn etwas schiefgehen kann, geht es schief.
  1. Hi,

    wie wir wissen, werden die Komponenten einer Multipart-Message mit Enctype="multipart/form-data" durch eine Boundary getrennt, die der Browser erzeugt und dem POST-Request Header mitgibt

    ja, ebenso wie in e-Mails.

    Wie groß ist denn die Wahrscheinlichkeit, dass auch die Datei, die gewöhnlich über <input type="file"> angehängt wird, eben genau diese Boundary als Bytefolge auch zum Inhalt hat?

    Kommt drauf an, welche Transfercodierung du wählst. In Quoted-Printable können niemals zwei aufeinanderfolgende '='-Zeichen auftreten; in base64 kommt AFAIK kein '-' vor. Also ist ein boundary-String, in dem ein Minuszeichen und zwei aufeinanderfolgende Gleichheitszeichen vorkommen, quasi idiotensicher.

    So long,
     Martin

    --
    Wissen erwirbt man, indem man immer das Kleingedruckte sorgfältig liest.
    Erfahrung bekommt man, indem man das nicht tut.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Moin,

      Kommt drauf an, welche Transfercodierung du wählst.

      Mit enctype="multipart/form-data" in einem Uploadform sendet der Browser (FF) den Part "file" unverändert:

      [file Binary-Data]
      -----------------------------41184676334--

      also weder quoted-printable noch base64. D.h., die Wahrscheinlichkeit, dass die Boundary innerhalb file erscheint, ist durchaus gegeben.

      Viele Grüße,
      Hotti

      1. Moin Moin!

        Mit enctype="multipart/form-data" in einem Uploadform sendet der Browser (FF) den Part "file" unverändert:

        [file Binary-Data]
        -----------------------------41184676334--

        also weder quoted-printable noch base64. D.h., die Wahrscheinlichkeit, dass die Boundary innerhalb file erscheint, ist durchaus gegeben.

        Richtig. Nur ist die Boundary zufällig ausgewürfelt, und so lange die Datei nicht zufällig alle möglichen Boundaries enthält, passiert mit hoher Wahrscheinlichkeit gar nichts.

        RFC2388 sagt sogar:

        4.1 Boundary

        As with other multipart types, a boundary is selected that does not
           occur in any of the data.

        Sollte der User-Agent also feststellen, dass die hochzuladende Datei oder auch der Wert in einem Eingabefeld die Boundary enthält, müßte er neu auswürfeln.

        Perls LWP::UserAgent nutzt letztlich HTTP::Message, das eine sub _boundary() hat. Die liefert ohne Argument (bzw. mit einem zu false evaluierendem Argument) einen konstanten Wert (extrem dämlicher Ansatz!), sonst würfelt es drei mal so viele Bytes aus wie im Argument angegeben, rechnet die in Base64 um und ersetzt alle Nicht-Wort-Zeichen (\W) durch ein X. Ob die Boundary zu den Inhalten paßt, wird nicht geprüft. Man verläßt sich wohl darauf, dass der Boundary-Wert zufällig genug ist, um keine Kollisionen zu verursachen.

        Was der FF treibt, kannst Du Dir selbst aus den Sources popeln. MakeMultipartBoundary klingt verdächtig gut, wird in SerializeDataMultipartFormData aufgerufen -- einmalig und ohne Ansehen der Daten, genau wie bei LWP::UserAgent.

        Mit LWP::UserAgent und HTTP::Request kannst Du Dir selbst einen POST-Request basteln, bei dem die Boundary in Werten und/oder File-Uploads vorkommt, den an verschiedene Server mit verschiedenen Applikationen schicken, und sehen, ob und wie es knallt.

        Alexander

        --
        Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
        1. Moin Moin!

          4.1 Boundary

          As with other multipart types, a boundary is selected that does not
             occur in any of the data.

          Schöner Satz, habe ich auch gelesen ;-)

          Sollte der User-Agent also feststellen, dass die hochzuladende Datei oder auch der Wert in einem Eingabefeld die Boundary enthält, müßte er neu auswürfeln.

          Das ist das, was ich wissen wollte, danke!!!

          Mit LWP::UserAgent und HTTP::Request kannst Du Dir selbst einen POST-Request basteln, bei dem die Boundary in Werten und/oder File-Uploads vorkommt, den an verschiedene Server mit verschiedenen Applikationen schicken, und sehen, ob und wie es knallt.

          Ja, klar: Experimentelle Physik!11!

          Viele Grüße,
          Hotti

          1. Moin Moin!

            4.1 Boundary

            As with other multipart types, a boundary is selected that does not
               occur in any of the data.

            Schöner Satz, habe ich auch gelesen ;-)

            Sollte der User-Agent also feststellen, dass die hochzuladende Datei oder auch der Wert in einem Eingabefeld die Boundary enthält, müßte er neu auswürfeln.

            Das ist das, was ich wissen wollte, danke!!!

            Achtung: Das steht nicht in der RFC, das ist meine Interpretation derselben.

            Mit LWP::UserAgent und HTTP::Request kannst Du Dir selbst einen POST-Request basteln, bei dem die Boundary in Werten und/oder File-Uploads vorkommt, den an verschiedene Server mit verschiedenen Applikationen schicken, und sehen, ob und wie es knallt.

            Ja, klar: Experimentelle Physik!11!

            Rate mal, was ich demnächst als Test Case in eines meiner aktuellen Projekte einbaue ...

            Alexander

            --
            Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
            1. Moin moin Alexander,

              Sollte der User-Agent also feststellen, dass die hochzuladende Datei oder auch der Wert in einem Eingabefeld die Boundary enthält, müßte er neu auswürfeln.

              Das ist das, was ich wissen wollte, danke!!!

              Achtung: Das steht nicht in der RFC, das ist meine Interpretation derselben.

              Ja, is klar.

              Ja, klar: Experimentelle Physik!11!

              Rate mal, was ich demnächst als Test Case in eines meiner aktuellen Projekte einbaue ...

              Ausgezeichnet ;-)

              Im Grunde genommen ist MIME Müll. Wenn ich nicht von handelsüblichen UserAgents abhängig bin, packe ich Multipart-Content in eine Sequenz als Binary. Da gibt es keine Delimiter, keine Boundaries, keine Abhängigkeiten vom Content und auch nicht von der Plattform. Ab ins Labor

              Viele Grüße,
              Hotti

              --
              Mist, der Ofen ist schon wieder aus, wo bleibt die Kohle!!!??