Sans aucun jQuery :
function decodeEntities(encodedString) {
var textArea = document.createElement('textarea');
textArea.innerHTML = encodedString;
return textArea.value;
}
console.log(decodeEntities('1 & 2')); // '1 & 2'
Cela fonctionne de la même manière que le réponse acceptée mais peut être utilisé en toute sécurité avec des entrées utilisateur non fiables.
Questions de sécurité dans des approches similaires
Comme noté par Mike Samuel en faisant cela avec un <div>
au lieu d'un <textarea>
avec une entrée utilisateur non fiable est une vulnérabilité XSS, même si la <div>
n'est jamais ajouté au DOM :
function decodeEntities(encodedString) {
var div = document.createElement('div');
div.innerHTML = encodedString;
return div.textContent;
}
// Shows an alert
decodeEntities('<img src="nonexistent_image" onerror="alert(1337)">')
Cependant, cette attaque n'est pas possible contre un <textarea>
parce qu'il n'y a pas d'éléments HTML dont le contenu est autorisé dans un fichier de type <textarea>
. Par conséquent, toutes les balises HTML encore présentes dans la chaîne "encodée" seront automatiquement codées en entités par le navigateur.
function decodeEntities(encodedString) {
var textArea = document.createElement('textarea');
textArea.innerHTML = encodedString;
return textArea.value;
}
// Safe, and returns the correct answer
console.log(decodeEntities('<img src="nonexistent_image" onerror="alert(1337)">'))
Avertissement : Faire cela en utilisant la méthode de jQuery .html()
y .val()
au lieu d'utiliser les méthodes .innerHTML
y .value
est également peu sûr* pour certaines versions de jQuery, même en utilisant un textarea
. En effet, les anciennes versions de jQuery seraient évaluer délibérément et explicitement les scripts. contenue dans la chaîne de caractères passée à .html()
. Ainsi, un code comme celui-ci affiche une alerte dans jQuery 1.8 :
//<!-- CDATA
// Shows alert
$("<textarea>")
.html("<script>alert(1337);</script>")
.text();
//-->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.2.3/jquery.min.js"></script>
* Merci à <a href="https://stackoverflow.com/users/2377920/eru-penkman">Eru Penkman </a>pour avoir détecté cette vulnérabilité.
0 votes
Le choix prématuré de la technologie (jQuery) invite à répondre à des questions de sécurité. Il serait peut-être préférable de fermer cette question en tant que doublon de stackoverflow.com/questions/1912501/ .