9
votes

Échapper aux caractères d'échappement

J'essaie d'imiter les drapeaux JSON_ENCODE CODE> BITMASK Mises en œuvre dans PHP 5.3.0, voici la chaîne que j'ai: xxx pré>

faire json_encode ($ S, JSON_HEX_APOS | JSON_HEX_QUOS) code> sortira les éléments suivants: p>

if (get_magic_quotes_gpc() && version_compare(PHP_VERSION, '6.0.0', '<'))
{
    /* JSON_HEX_APOS and JSON_HEX_QUOT are availiable */
    if (version_compare(PHP_VERSION, '5.3.0', '>=') === true)
    {
        $_GET = json_encode($_GET, JSON_HEX_APOS | JSON_HEX_QUOT);
        $_POST = json_encode($_POST, JSON_HEX_APOS | JSON_HEX_QUOT);
        $_COOKIE = json_encode($_COOKIE, JSON_HEX_APOS | JSON_HEX_QUOT);
        $_REQUEST = json_encode($_REQUEST, JSON_HEX_APOS | JSON_HEX_QUOT);
    }

    /* mimic the behaviour of JSON_HEX_APOS and JSON_HEX_QUOT */
    else if (extension_loaded('json') === true)
    {
        $_GET = str_replace(array(), array('\\u0022', '\\u0027'), json_encode($_GET));
        $_POST = str_replace(array(), array('\\u0022', '\\u0027'), json_encode($_POST));
        $_COOKIE = str_replace(array(), array('\\u0022', '\\u0027'), json_encode($_COOKIE));
        $_REQUEST = str_replace(array(), array('\\u0022', '\\u0027'), json_encode($_REQUEST));
    }

    $_GET = json_decode(stripslashes($_GET));
    $_POST = json_decode(stripslashes($_POST));
    $_COOKIE = json_decode(stripslashes($_COOKIE));
    $_REQUEST = json_decode(stripslashes($_REQUEST));
}


0 commentaires

6 Réponses :


2
votes

Il échappe à la barre oblique inverse ainsi qu'à la citation. Il est difficile de traiter des évasions échappées, comme vous le faites ici, car il se transforme rapidement en jeux de comptage au dos. : - /


11 commentaires

Mais je crois que je rends les maths correctement. Le remplacement des guillemets simples ne doit pas nécessiter que deux backslashes, non?


Ce n'est pas aussi simple car certaines de vos coulisses de cordes sont en guillemets, ce qui n'a pas besoin de citations simples échappées et certaines sont en guillemets simples, qui font. Plus la complication d'essayer de générer une constante de chaîne valide. Pour une autre langue. Qui arrive avoir des règles de citation presque identiques. (Mal de tête? :-)


De plus, aussi, votre échantillon de chaîne commence avec explicitement explicit dans la chaîne . Donc, vous demandez json_encode () pour échapper à l'échappement, aussi. Et sur tout cela, je pense que le besoin de json_encode () pour produire des entités UTF est discutable (j'ai trouvé des bugs dans cette fonction avant).


@Staticsan: Oui! Néanmoins, je ne peux pas comprendre pourquoi str_replace ("\\ '", "\\\ u0027', json_encode (addslashes (" O'Reilly "))) et str_replace (" \ \ '",' \\\\\ u0027 ', json_encode (addslashes (" O'Reilly "))) Produit exactement la même sortie. Peut tu?


@staticsan: le \\\ u0027 sortit uniquement deux backslashes et échapper au "U"?


Je pense que '\\\ u0027' fait la même chose que '\\\\ u0027' parce que '\ u' (notez le Single Citations) ne signifie rien à PHP, donc il est sémantiquement la même chose.


J'ai rencontré un problème similaire impliquant la citation et le JSON sur PHP et il a dû le faire avec magic_quotes_gpc, avez-vous vérifié si les citations magiques sont désactivées?


@dabito: Non, magic_quotes est sur . Le str_replace est là pour corriger magic_quotes , voir php.net/manual/fr/function.get-magic-quotes-gpc.php#95697 .


Aie. La bonne chose à faire est de tourner magic_quotes éteint. Si vous ne pouvez pas faire cela, la «chose la première la chose que vous faites avec une entrée est placée par Stripslashes () . Tout le plus tard est trop tard et que vous rencontrerez dans la sorte de confusion que vous rencontrez.


@staticsan: Pourquoi dites-vous qu'Aut? Ceci est bien plus rapide que toute autre méthode que j'ai vue et plus complète également.


"Autouré" est que Magic_Quotes tente de résoudre un problème réel et courant (injection SQL) au mauvais endroit (lorsque les données sont soumises à la page au lieu d'une insertion de DB) et de la mauvaise manière (addslashes au lieu de la fonction de citation de la DB) . Les éteignez!



1
votes

Etant donné que vous allez json_encode la chaîne \ ' Vous devrez d'abord coder le \ puis le ' . Donc, vous aurez \\ et \ u0027 . Concaténant ces résultats \\\ u0027 .


3 commentaires

Je ne suis toujours pas suivi. Pourquoi \ u0027 doit-il être échappé? json_encode ('"', json_hex_quot); //" \ u0022 " et json_encode (" '"json_hex_apos) //" \ u0027 " renvoie une sortie similaire, mais le Tout d'abord n'a pas besoin de barres obliques supplémentaires.


Votre chaîne d'origine est 'o \' Rei "lly '(tous en guillemets simples). En guillemets simples, le \ n'est pas un caractère d'échappement. Donc, dans ce cas, il sera codé aussi. Si vous écrivez" O'REI \ "LLY «Vous obtiendrez le résultat nécessaire.


Dans des citations simples "\" est un caractère d'échappement. Néanmoins, j'ai essayé votre suggestion et cela ne fonctionne toujours pas avec \\ u0027 .



0
votes

Le \ généré par addSlashes () obtenir re-échappé par json_encode () . Vous vouliez probablement dire que ce faire JSON_ENCODE ($ S, JSON_HEX_APOS | JSON_HEX_QUOS | JSON_HEX_QUOT) génère les éléments suivants mais que vous avez utilisé $ STR au lieu de $ s , qui confondu tout le monde.

Si vous évaluez la chaîne "o \\\ u0027rei \\\ u0022lly" dans javascript, vous obtiendrez "o \ 'rei \" lly " et je suis sûr que c'est pas ce que vous voulez. Lorsque vous l'évaluez, vous avez probablement besoin de tous les codes de contrôle supprimés. Allez-y, piquez dans un fichier: Alert ("O \\\ u0027rei \\\ u0022lly ") .

Conclusion: Vous évitez les citations deux fois, ce qui n'est probablement pas ce dont vous avez besoin. JSON_ENCODE Est déjà échappé Tout ce qui est nécessaire pour que n'importe quel analyseur JavaScript puisse renvoyer la structure de données d'origine. Dans votre cas, c'est la chaîne que vous avez obtenue après l'appel à addSlashes .


Preuve: xxx


3 commentaires

J'ai "besoin" pour échapper à la chaîne deux fois, car je reçois déjà la chaîne avec des barres obliques ajoutées au cas où magic_quotes dans sur . Toujours votre réponse ne répond pas à mon problème avec le remplacement des caractères échappés.


Vous n'avez pas lu assez attentivement. Vous n'avez pas besoin de faire ça. En fait, vous ne devrait pas le faire. C'est juste ce qui se passe à cause de AddsLashes (). `est échappé par json_encode` car ils sont considérés comme faisant partie de la chaîne souhaitée comme sortie. Ce que vous devriez faire, c'est désactiver citations magiques (ou force array_walk_recrsive ($ _ demande, 'stripslashes') ) et tout sera clair.


Et le monde serait beaucoup plus sûr sans armes nucléaires, mais cela ne signifie pas qu'il n'y en a pas. Ma chaîne d'origine a des barres obliques et la raison même de cette question est d'éviter les appels récursifs dans php> = 5.2 <5,3 pour corriger magic_quotes (voir ma solution PHP 5.3 à php.net/manual/fr/funcunction.get- magie-cites-gpc.php # 95697 ).



2
votes

Si je comprends correctement, vous voulez juste savoir pourquoi vous devez utiliser

p>

'\\\ u0027' code> et pas seulement '\\ u0027 ' code> blockQuote>

Vous évacuez la valeur SLASH et la valeur Unicode de caractère. Avec cela, vous disez à JSON qu'il devrait poser une apostrophe là-bas, mais il a besoin de la barre oblique inverse et de savoir que vous devez savoir qu'un code de caractère hexadécimal unicode est suivant. P>

puisque vous échappez à cette chaîne: P >

$s = addslashes('O\'Rei"lly'); // O\'Rei\"lly


0 commentaires

14
votes

La chaîne PHP

"O\\\u0027Rei\\\u0022lly"


1 commentaires

Logique. Donc, faire str_replace (tableau ('\ "' ',' \ ''), tableau ('\\ u0022', '\\ u0027'), json_encode (addslashes ('o \' Rei" LLY ')))) donnera toujours exactement la même sortie que JSON_ENCODE (AddSlashes ('o \' Rei "LLY '), JSON_HEX_APOS | JSON_HEX_QUOT) , non?



2
votes

Lorsque vous encodez une chaîne pour JSON, certaines choses doivent être échappées quelles que soient les options. Comme d'autres ont souligné, cela inclut '\' afin que tout backslash fonctionne via JSON_ENCODE sera doublé. Depuis que vous exécutez d'abord votre chaîne via AddSlashes, qui ajoute également des backslashes aux citations, vous ajoutez beaucoup de gastrastes supplémentaires. La fonction suivante imitera la manière dont JSON_ENCODECODE encoderait une chaîne. Si la chaîne a déjà eu des goulots ajoutés, ils seront doublés. XXX


0 commentaires