Frage

Ich erfinde das Rad neu und erstelle meine eigenen JSON-Analysemethoden in Java.

Ich gehe durch die (sehr schön!) dokumentation über json.org.Der einzige Teil, bei dem ich mir nicht sicher bin, ist, wo es heißt "oder Steuerzeichen"

Da die Dokumentation so klar ist und JSON so einfach und leicht zu implementieren ist, dachte ich, ich würde fortfahren und die Spezifikation benötigen, anstatt locker zu sein.

Wie würde ich richtig Steuerzeichen in Java entfernen?Vielleicht gibt es einen Unicode-Bereich?

enter image description here


Bearbeiten:A (häufig?) fehlendes Puzzleteil

I wurden informiert dass es andere Steuerzeichen außerhalb von gibt der definierte Bereich 1 2 das kann lästig sein in <script> Tags.

Vor allem die Zeichen U + 2028 und U + 2029, Zeilen- und Absatztrennzeichen, die als Zeilenumbrüche fungieren.Das Einfügen einer neuen Zeile in die Mitte eines Zeichenfolgenliterals führt höchstwahrscheinlich zu einem Syntaxfehler (nicht abgeschlossenes Zeichenfolgenliteral). 3

Obwohl ich glaube, dass dies keine XSS-Bedrohung darstellt, ist es dennoch eine gute Idee, zusätzliche Regeln für die Verwendung in hinzuzufügen <script> Tags.

  • Seien Sie einfach und codieren Sie alle nicht "ASCII-druckbaren" Zeichen mit \u Schreibweise.Diese Charaktere sind von Anfang an ungewöhnlich.Wenn Sie möchten, können Sie die Whitelist hinzufügen, aber ich empfehle einen Whitelist-Ansatz.
  • Falls Sie es nicht wissen, vergiss nicht über </script (groß- und Kleinschreibung wird nicht beachtet), was könnte HTML-Skript-Injektion verursachen zu deiner Seite mit den Charakteren </script><script src=http://tinyurl.com/abcdef>.Keines dieser Zeichen ist standardmäßig in JSON codiert.
War es hilfreich?

Lösung

Werden Charakter.isISOControl(...) tun?UTF-16 ist übrigens eine Codierung von Unicode-Codepunkten...Werden Sie auf Byte-Ebene oder auf Zeichen- / Codepunktebene arbeiten?Ich empfehle, die Zuordnung von UTF-16 zu Zeichenströmen zu Javas Kern-APIs zu belassen...

Andere Tipps

Auch wenn es nicht sehr spezifisch ist, würde ich annehmen, dass sie sich auf die beziehen Zeichenkategorie "Steuerung" aus der Unicode-Spezifikation.

In Java können Sie überprüfen, ob ein Zeichen c ist ein Unicode-Steuerzeichen mit dem folgenden Ausdruck: Character.getType(c) == Character.CONTROL.

Ich glaube die Unicode-Definition eines Steuerzeichens is:

Die 65 Zeichen in den Bereichen U+0000..U+001F und U+007F..U+009F.

Das ist ihre Definition von a kontrollcode, aber dem obigen folgt der Satz "Auch als Steuerzeichen bekannt.", so...

Ich weiß, dass die Frage vor ein paar Jahren gestellt wurde, aber ich antworte trotzdem, weil die akzeptierte Antwort nicht korrekt ist.

Character.isISOControl(int codePoint) 

führt die folgende Überprüfung durch:

(codePoint >= 0x00 && codePoint <= 0x1F) || (codePoint >= 0x7F && codePoint <= 0x9F);

Die JSON-Spezifikation definiert unter https://tools.ietf.org/html/rfc7159:

  1. Verbindungszeichenfolgen

    Die Darstellung von Zeichenfolgen ähnelt den in C verwendeten Konventionen familie von Programmiersprachen.Eine Zeichenfolge beginnt und endet mit Anführungszeichen.Alle Unicode-Zeichen können innerhalb der platziert werden anführungszeichen, mit Ausnahme der Zeichen, die maskiert werden müssen:anführungszeichen, umgekehrter Solidus und die Steuerzeichen (U+0000 durch U + 001F).

Character.isISOControl(int codePoint) 

markiert alle Zeichen, die maskiert werden müssen (U+0000-U+001F), obwohl es auch Zeichen kennzeichnet, die nicht maskiert werden müssen (U+007F-U+009F).Es ist nicht erforderlich, die Zeichen zu entkommen (U+007F-U+009F).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top