Je génère des valeurs à partir d'une base de données (elle n'est pas vraiment ouverte à l'entrée publique, mais elle est ouverte à l'entrée par un utilisateur de l'entreprise - ce qui signifie que je ne m'inquiète pas pour XSS ).
J'essaie de sortir une balise comme celle-ci:
<a href="" onclick="DoEdit('DESCRIPTION');">Click Me</a>
DESCRIPTION est en fait une valeur de la base de données qui ressemble à ceci:
Prelim Assess "Mini" Report
J'ai essayé de remplacer "par \", mais peu importe ce que j'essaye, Firefox continue de couper mon appel JavaScript après l'espace après le mot évaluer , et cela provoque toutes sortes de problèmes.
Je dois rejeter la réponse évidente, mais pour la vie de moi, je ne peux pas le comprendre.
Quelqu'un veut-il souligner mon idiotie?
Voici la page HTML entière (ce sera finalement une page ASP.NET , mais pour résoudre ce problème, j'ai retiré tout le reste sauf le code du problème)
<html>
<body>
<a href="#" onclick="DoEdit('Preliminary Assessment \"Mini\"'); return false;">edit</a>
</body>
</html>
la source
onclick
pièce jointe d'événement discrète et de déplacer toutes vos informations de base de données dans un îlot de données. Les choses seront plus propres et vous obtiendrez en fait une sorte d'erreur de syntaxe lorsque vos chaînes s'échapperont mal.Réponses:
Vous devez échapper la chaîne dans laquelle vous écrivez
DoEdit
pour effacer les caractères entre guillemets. Ils provoquent laonclick
fermeture prématurée de l'attribut HTML.L'utilisation du caractère d'échappement JavaScript
\
, n'est pas suffisante dans le contexte HTML. Vous devez remplacer le guillemet avec la représentation d' une entité XML appropriée,"
.la source
'mystring'.replace(/"/g, '"');
"
fonctionnerait dans ce cas particulier, comme suggéré avant moi, en raison du contexte HTML.Cependant, si vous souhaitez que votre code JavaScript soit échappé indépendamment pour n'importe quel contexte, vous pouvez opter pour le codage JavaScript natif:
'
devient\x27
"
devient\x22
Votre onclick deviendrait donc:
DoEdit('Preliminary Assessment \x22Mini\x22');
Cela fonctionnerait par exemple également lors du passage d'une chaîne JavaScript en tant que paramètre à une autre méthode JavaScript (
alert()
c'est une méthode de test facile pour cela).Je vous renvoie à la question de débordement de pile en double, comment puis-je échapper une chaîne dans le code JavaScript à l'intérieur d'un gestionnaire onClick? .
la source
"
, bien sûr."
est requis dans les valeurs d'entrée, c'est-à-dire<input value="\x22quoted string\x22">
qu'il ne fonctionnera pas.onclick="..."
). La valeur d'unvalue
attribut n'est pas traitée dans un contexte JavaScript, uniquement dans un contexte HTML.'mystring'.replace(/"/g, '\\x22').replace(/'/g, '\\x27')
Devrait faire l'affaire.
la source
unescape
Mes amis , il y a déjà la fonction en JavaScript qui fait l'échappatoire pour\"
:la source
Le problème est que HTML ne reconnaît pas le caractère d'échappement. Vous pouvez contourner cela en utilisant les guillemets simples pour l'attribut HTML et les guillemets doubles pour le onclick.
la source
C'est comme ça que je fais, en gros
str.replace(/[\""]/g, '\\"')
.la source
Si vous assemblez le HTML en Java, vous pouvez utiliser cette jolie classe d'utilitaires d'Apache commons-lang pour faire tout l'échappement correctement:
la source
J'ai fait un exemple en utilisant jQuery
Et cela fonctionne dans Internet Explorer et Firefox.
la source
Vous pouvez copier ces deux fonctions (répertoriées ci-dessous) et les utiliser pour échapper / échapper toutes les guillemets et les caractères spéciaux. Vous n'avez pas besoin d'utiliser jQuery ou toute autre bibliothèque pour cela.
la source
Veuillez trouver dans le code ci-dessous qui échappe les guillemets simples dans le cadre de la chaîne entrée en utilisant une expression régulière. Il valide si la chaîne entrée par l'utilisateur est séparée par des virgules et en même temps, elle échappe même aux guillemets simples entrés dans le cadre de la chaîne.
Pour échapper aux guillemets simples, entrez simplement une barre oblique inverse suivie d'une guillemet simple comme: \ ' dans le cadre de la chaîne. J'ai utilisé le validateur jQuery pour cet exemple, et vous pouvez l'utiliser selon votre convenance.
Exemples de chaînes valides:
'Bonjour'
'Bonjour le monde'
'Bonjour le monde'
'Bonjour le monde',' '
"C'est mon monde", "Je ne peux pas profiter de cela sans moi.", "Bienvenue, invité"
HTML:
JavaScript:
la source
Échappez également aux espaces blancs. Il me semble que Firefox suppose trois arguments au lieu d'un.
est le caractère d'espace insécable. Même si ce n'est pas tout le problème, ce peut être une bonne idée.la source
Vous devez échapper aux guillemets avec des doubles barres obliques inverses.
Cela échoue (produit par json_encode de PHP ):
Cela marche:
la source
Vous pouvez utiliser les méthodes jQuery escape () et unescape (). Comme ci-dessous,
Utilisez
escape(str);
pour échapper à la chaîne et récupérer à nouveau en utilisantunescape(str_esc);
.la source