Question

Je réinvente la roue et crée mes propres méthodes d'analyse JSON en Java.

Je me base sur la (très belle !) documentation sur json.org.La seule partie dont je ne suis pas sûr, c'est là où il est écrit "ou un caractère de contrôle"

Étant donné que la documentation est si claire et que JSON est si simple et facile à mettre en œuvre, j'ai pensé que j'allais aller de l'avant et exiger la spécification au lieu d'être lâche.

Comment pourrais-je correctement supprimer les caractères de contrôle en Java ?Peut-être existe-t-il une gamme Unicode ?

enter image description here


Modifier:Une pièce (souvent ?) manquante au puzzle

je avoir été informé qu'il existe d'autres caractères de contrôle en dehors de la plage définie 1 2 cela peut être gênant dans <script> Mots clés.

Notamment les caractères U+2028 et U+2029, Séparateur de lignes et de paragraphes, qui font office de nouvelles lignes.L'injection d'une nouvelle ligne au milieu d'un littéral de chaîne provoquera très probablement une erreur de syntaxe (littéral de chaîne non terminé). 3

Même si je pense que cela ne pose pas de menace XSS, c'est quand même une bonne idée d'ajouter des règles supplémentaires à utiliser dans <script> Mots clés.

  • Soyez simplement simple et encodez tous les caractères non « imprimables ASCII » avec \u notation.Ces personnages sont rares au départ.Si vous le souhaitez, vous pouvez ajouter des éléments à la liste blanche, mais je recommande une approche de liste blanche.
  • Au cas où vous ne le sauriez pas, N'oubliez pas à propos </script (non sensible à la casse), qui pourrait provoquer l'injection de script HTML à votre page avec les personnages </script><script src=http://tinyurl.com/abcdef>.Aucun de ces caractères n'est codé par défaut en JSON.
Était-ce utile?

La solution

Volonté Caractère.isISOControl(...) faire?Par ailleurs, UTF-16 est un encodage de points de code Unicode...Allez-vous opérer au niveau des octets ou au niveau des caractères/points de code ?Je recommande de laisser le mappage de l'UTF-16 aux flux de caractères vers les API principales de Java...

Autres conseils

Même si ce n'est pas très précis, je suppose qu'ils font référence au catégorie de caractères "contrôle" à partir de la spécification Unicode.

En Java, vous pouvez vérifier si un caractère c est un caractère de contrôle Unicode avec l'expression suivante : Character.getType(c) == Character.CONTROL.

Je crois la définition Unicode d'un caractère de contrôle est:

Les 65 caractères dans les plages U+0000..U+001F et U+007F..U+009F.

C'est leur définition d'un code de contrôle, mais ce qui précède est suivi de la phrase "Aussi connu sous le nom de personnages de contrôle.", donc...

Je sais que la question a été posée il y a quelques années, mais je réponds quand même, car la réponse acceptée n'est pas correcte.

Character.isISOControl(int codePoint) 

effectue la vérification suivante :

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

La spécification JSON définit à https://tools.ietf.org/html/rfc7159:

  1. Cordes

    La représentation des chaînes est similaire aux conventions utilisées dans la famille C des langages de programmation.Une chaîne commence et se termine par des guillemets.Tous les caractères Unicode peuvent être placés dans les guillemets, à l'exception des caractères qui doivent être échappés:guillemet, solidus inversé et Les caractères de contrôle (U + 0000 via U + 001F).

Character.isISOControl(int codePoint) 

signalera tous les caractères qui doivent être échappés (U+0000-U+001F), bien qu'il marque également les caractères qui n'ont pas besoin d'être échappés (U+007F-U+009F).Il n'est pas nécessaire d'échapper aux caractères (U+007F-U+009F).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top