2009-05-05 6 views
0

J'utilise le titre d'attribut HTML pour régler certains paramètres comme ceci:Pourquoi l'attribut html est-il retourné en tant que 'htmldecoded' même s'il est codé en source html?

<a href... title="Go to next chapter">Go</a> 

Ensuite, le plugin jquery passe par tous les attributs [titre] et fait infobulles jolies. Très simplifié une nouvelle div est créé pour le lien ci-dessus

<div style="position:absolute...">Go to next chapter</div> 

Le problème est que le titre est modifiable par l'utilisateur, de sorte qu'il peut écrire ce qu'il veut. J'ai d'abord pensé que l'encodage html est bien, mais il s'est avéré que j'avais tort. Si je

<a id="a" title="&lt;script&gt;alert(10);&lt;/script&gt">Go</a> 

alors la div infobulle ressemble à ceci:

<div style="position:absolute..."><script>alert(10)</script></div> 

1) Pourquoi navigateur décode l'attribut title lors de l'interrogation de sa valeur?

2) Et comment puis-je le résoudre? (Je sais qu'une solution est à double codage html, mais il est awfull)

Comment tester: considérer ce code

<html> 
<body> 
    <!-- encoding once, this doesn't work --> 
    <a id="a" title="&lt;script&gt;alert(10);&lt;/script&gt">atitle</a> 
    <!-- encoding twice, this works --> 
    <a id="b" title="&amp;lt;script&amp;gt;alert(10);&amp;lt;/script&amp;gt">btitle</a> 

    <script> 
    function w(x){ document.write(x.attributes["title"].value);} 
    w(a); // shows alert 
    w(b); // outputs it correctly into the page 
    </script> 
</body> 
</html> 

Répondre

1

1) La valeur d'attribut est la valeur décodée - c'est la seule façon qui fait sens si vous y pensez. Si vous définissez une valeur javascript sur "\ n", puis l'alertez, voulez-vous revenir à "\ n" ou à un retour à la ligne réel? L'attribut title est du texte ... il vous suffit d'encoder HTML pour l'écrire.

2) Vous pouvez double encoder, ou vous pouvez utiliser un nœud de texte:

var node = document.createTextNode(x.attributes['title'].value); 
document.appendChild(node); 

Ceci est le meilleur moyen, puis les araignées/navigateurs non javascript verront l'attribut title correct.

Questions connexes