Comment remplacer/escape U+2028 ou U+2029 caractères en PHP pour arrêter mon JSONP API de rupture
Ok je suis en cours d'exécution publique JSONP API laquelle les données sont servis à partir de mon serveur PHP. Je viens de lire cet article:
- JSON: Le sous-ensemble de JavaScript qui n'est pas (par Magnus Holm; Mai 2011)
(veuillez lire pour des précisions)
En gros si mon chaînes JSON contient un U+2028 caractères (Unicode séparateur de ligne) ou U+2029 caractères (Unicode paragraphe séparateur) alors c'est parfaitement JSON valide. Cependant lors de l'utilisation de JSONP le JSON est exécutée en tant que JavaScript et pas de chaîne de caractères en JavaScript peut contenir un littéral U+2028 ou un U+2029 que ça va casser le JavaScript. Apparemment ce n'est généralement pas un problème tant que vous utiliser un parser JSON, mais dans le cas de JSONP le navigateur est le parser JSON.
Essentiellement si ces personnages étaient à l'intérieur de chaînes dans mon JSONP données d'être envoyé au client ce serait jeter une ligne ou d'un saut de paragraphe dans la chaîne de caractères qui briserait le JavaScript et l'arrêt de l'exécution. C'est une possibilité que l'API est de l'envoi de retour du client données saisies. Quelqu'un pourrait potentiellement entrer un U+2028 ou un U+2029 dans la base de données, donc quand je l'ai envoyer en JSONP il va casser tout de la mise en œuvre à l'aide de mon API.
Donc ma question est, en PHP comment puis-je nettoyer/sortie d'échappement les données JSON pour supprimer ou de fuir le U+2028 et U+2029 caractères avant de les envoyer au client?
Actuellement mon processus est de faire un json_encode sur un tableau de données et l'envoi des données vers le client. Dois-je échapper les données par boucle à travers la matrice et le filtrage, ou échapper à tout le JSON chaîne codée à la fois?
L'autre chose est que je ne suis pas sûr de savoir comment échapper à la U+2028 et U+2029 caractères en PHP de toute façon. Puis-je simplement faire un str_replace? Je ne suis pas sûr si str_replace est multi-octets en sécurité et il n'y a pas de mb_str_replace fonction, sauf si j'utilise de la mesure. Alors, comment pensez-vous de retirer ou d'échapper à ces caractères unicode?
Merci beaucoup.
- À moins que j'ai lu l'article de manière incorrecte, tu ne peux pas le remplacer par
\u2028
? \u2028
etu2029
sont en unicode caractères de saut de ligne. Vous voulez que votre application afin de permettre à ces caractères dans les cordes? Sens, quelle que soit accepte ce texte sur votre serveur activement convertit CR/LF dans l'un de ces personnages, parce que pratiquement personne n'utilise les nouveaux caractères de saut de ligne. Je doute que cela. Je devine que vous voulez juste pour éliminer tous les retours à la ligne, soit CR/LF, ou les de nouveaux. Dans lequel cas, il suffit de les éliminer, au lieu d'insérer littérale des séquences d'échappement.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez remplacer
U+2028
,U+2029
avec"\u2028"
,"\u2029"
soit sur le PHP côté ou de l'JavaScript côté, ou les deux, il n'a pas d'importance tant qu'il arrive au moins une fois (c'est idempotent).Vous pouvez simplement utiliser la chaîne ordinaire des fonctions de remplacement. Ils n'ont pas besoin d'être "multi-octets en sécurité", et vous pouvez le faire tout aussi facilement dans toute l'encodage Unicode (UTF-8, UTF-16, UTF-32 sont tous aussi beaux). PHP n'a pas les séquences d'échappement Unicode dernière fois que j'ai vérifié ce qui est une raison de plus pourquoi PHP est une blague, mais vous pouvez utiliser le
\x
échapper avec l'encodage UTF-8...(En bref, la raison pour laquelle il n'y a pas de chaîne multi-octets remplacer la fonction est parce qu'il serait redondant, ce serait exactement le même comme un non-chaîne multi-octets fonction remplacer.)
Ou vous pouvez simplement ne rien faire du tout, depuis PHP échappe les caractères non Unicode par défaut dans
json_encode()
:{
ou[
, et le deuxième personnage sera soit"
,'
, d'espaces, ou un chiffre).Il est intéressant de souligner que ce n'est plus nécessaire.
Par défaut,
json_encode()
code tous caractères non-ASCII (U+2028 & U+2029), et également s'échappe de la barre oblique, même si ça n'a pas besoin d'être échappés par la spécification JSON. Il n'y a aucun mal à s'en échapper, et il peut être plus sûr dans certains contextes. Donc, par défaut, ces caractères sont échappés de toute façon.La
JSON_UNESCAPED_UNICODE
constante sorties sans échappement Unicode, ce qui peut économiser des octets. Cependant, tout comme le caractère barre oblique est échappé, car il peut être dangereux dans certains contextes, donc trop U+2028 & U+2029 sont aussi échappé, parce qu'ils sont trop dangereux dans certains contextes. Ce n'était pas le cas au moment où vous avez posé votre question: cette fonctionnalité a été ajoutée en PHP, plus récemment,.(Ces échappe peut être désactivée avec
JSON_UNESCAPED_SLASHES
etJSON_UNESCAPED_LINE_TERMINATORS
, respectivement.)