Franzi: Problem mit Zeichenkodierung

Hallo!

Ich benutze die 2 Funktionen aus dem Beispiel um mich bei Angriffen zu schützen. Jetzt habe ich ein Problem bemerkt.

Ich habe eine Url als string. Die Werte der Parameter werden durch urlencode() kodiert. Dort können also Werte wie "?test=nur+ein+test" stehen.
Wenn ich das aber von der Funktion oben "kodieren" lasse, ergibt das aber
?test=nur稩ﺵ
bzw. "?test=nur稩ﺵ".

Ist die Funktion "kaputt" oder mache ich etwas falsch? Wie sollte ich richtig kodieren weil in dem Beispiel davon abgeraten wird htmlentities zu nutzen?

Beste Grüße, Franzi

  1. Wenn ich das aber von der Funktion oben "kodieren" lasse, ergibt das aber
    ?test=nur稩ﺵ
    bzw. "?test=nur稩ﺵ".

    [1] Benutze niemals fremede Funktionen, die Du nicht verstehst.

    Ist die Funktion "kaputt" oder mache ich etwas falsch?

    Siehe [1]

    Wie sollte ich richtig kodieren weil in dem Beispiel davon abgeraten wird htmlentities zu nutzen?

    Das kommt darauf an. Eine allgemeingültige Funktion kann es nicht geben, weil keiner weis, was Du absichern willst.

    Hier wird gern geraten, den Blogbeitrag zum Thema Kontextwechsel zu lesen und zu beachten. Dedlfix hat sich sehr viel Mühe gegeben die Problematik umfassend zu erklären und das Resultat überzeugt.

    Jörg Reinholz

    1. Hi!

      [1] Benutze niemals fremede Funktionen, die Du nicht verstehst.

      Ich verstehe die Funktion eigentlich schon. Sie wandelt erst die Zeichenkodierung zu UTF8, trennt dann die einzelnen Zeichen und ersetzt die, die nicht in der whitelist stehen durch deren Ascii-Code. Das die Leerzeichen im Parameter durch '+' ersetzt wurden anstatt durch '%20', liegt an urlencode().
      Ich konnte den Fehler auch eingrenzen und zwar gibt die Funktion das erwartete Ergebnis zurück wenn ich die Zeile
      $string = mb_convert_encoding($string_, "UTF-8", "7bit, UTF-7, UTF-8, UTF-16, ISO-8859-1, ASCII");
      ändere in
      $string = mb_convert_encoding($string_, "UTF-8");

      Warum ändert sich das Ergebnis wenn die anderen Kodierungen expliziet angegeben werden? Ich teste lokal.

      Hier wird gern geraten, den Blogbeitrag zum Thema Kontextwechsel zu lesen und zu beachten. Dedlfix hat sich sehr viel Mühe gegeben die Problematik umfassend zu erklären und das Resultat überzeugt.

      Ich kenne die Problematik und sogar den Artikel aber die Funktion durch htmlspecialchars() zu ersetzen ändert ja nichts an dem Problem das ich mit der Funktion habe. Und htmlentities() scheidet aus den verlinkten Gründen aus.

      Beste Grüße, Franzi

      1. hi,

        Ich kenne die Problematik und sogar den Artikel aber die Funktion durch htmlspecialchars() zu ersetzen ändert ja nichts an dem Problem das ich mit der Funktion habe. Und htmlentities() scheidet aus den verlinkten Gründen aus.

        Es scheidet deswegen aus, weils mit URI-Encoding absolut nichts zu tun hat.

        Horst

        1. Es scheidet deswegen aus, weils mit URI-Encoding absolut nichts zu tun hat.

          Ich möchte die URI aber im HTML-Kontext ausgeben. Und da brauch ich ebend doch so eine Art Kodierung.

          1. Hallo,

            Es scheidet deswegen aus, weils mit URI-Encoding absolut nichts zu tun hat.
            Ich möchte die URI aber im HTML-Kontext ausgeben. Und da brauch ich ebend doch so eine Art Kodierung.

            nein, falsche Blickrichtung. Du hast zuerst mal eine URL/URI. Also musst du als erstes die Maskierungsregeln für den URI-Kontext anwenden - und das heißt: Alle Zeichen außerhalb von ASCII werden Prozent-codiert. Was dabei herauskommt, ist pures ASCII. Im nächsten Schritt müssen für den Übergang zum HTML-Kontext nur noch die Zeichen besonders codiert bzw. maskiert werden, die im HTML-Kontext eine Sonderbedeutung haben, also [&<>] und innerhalb von Attributwerten auch noch das Anführungszeichen.

            Ciao,
             Martin

            --
            Die späteren Ehen sind oft glücklicher als die erste, weil das natürliche Ende bereits absehbar ist.
              (George Bernhard Shaw)
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
  2. hi,

    Wenn ich das aber von der Funktion oben "kodieren" lasse, ergibt das aber
    &#x003f;test&#x003d;nur&#x7a29;&#xfeb5;&#xeb2d;
    bzw. "?test=nur稩ﺵ".

    Das ist Schrott zum Quadrat. Für URIs gibts es seit Jahrzehnten das Percent-Encoding, beschrieben in einschlägigen RFCs und absolut keinen Grund, das irgendwie anders zu machen.

    --