Codifica HTML persa quando l'attributo viene letto dal campo di input


745

Sto usando JavaScript per estrarre un valore da un campo nascosto e visualizzarlo in una casella di testo. Il valore nel campo nascosto è codificato.

Per esempio,

<input id='hiddenId' type='hidden' value='chalk &amp; cheese' />

viene trascinato dentro

<input type='text' value='chalk &amp; cheese' />

tramite alcuni jQuery per ottenere il valore dal campo nascosto (è a questo punto che perdo la codifica):

$('#hiddenId').attr('value')

Il problema è che quando leggo chalk &amp; cheesedal campo nascosto, JavaScript sembra perdere la codifica. Non voglio che il valore sia chalk & cheese. Voglio che il valore letterale amp;venga mantenuto.

Esiste una libreria JavaScript o un metodo jQuery che codificherà HTML una stringa?


Puoi mostrare il Javascript che stai usando?
Sinan Taifour,

1
ho aggiunto come ottengo valore dal campo nascosto
AJM il

5
NON utilizzare il metodo innerHTML (il metodo jQuery .html () usa innerHTML), come su alcuni browser (ho testato solo Chrome), questo non sfuggirà alle virgolette, quindi se dovessi mettere il tuo valore in un valore di attributo , finiresti con una vulnerabilità XSS.
James Roper,

21
in quale contesto è chalke cheesemai usato insieme 0_o
d -_- b

2
@d -_- b quando si confrontano due elementi. esempio. sono diversi come il gesso e il formaggio;)
Anurag,

Risposte:


1067

EDIT: questa risposta è stata pubblicata molto tempo fa e la htmlDecodefunzione ha introdotto una vulnerabilità XSS. È stato modificato cambiando l'elemento temporaneo da diva a textareariducendo la possibilità XSS. Ma al giorno d'oggi, ti incoraggio a utilizzare l'API DOMParser come suggerito in altre risposte .


Uso queste funzioni:

function htmlEncode(value){
  // Create a in-memory element, set its inner text (which is automatically encoded)
  // Then grab the encoded contents back out. The element never exists on the DOM.
  return $('<textarea/>').text(value).html();
}

function htmlDecode(value){
  return $('<textarea/>').html(value).text();
}

Fondamentalmente un elemento textarea viene creato in memoria, ma non viene mai aggiunto al documento.

Sulla htmlEncodefunzione ho impostato innerTextl'elemento dell'elemento e recuperato il codificato innerHTML; sulla htmlDecodefunzione ho impostato ilinnerHTML valore dell'elemento e innerTextviene recuperato.

Controlla un esempio corrente qui .


95
Funziona per la maggior parte degli scenari, ma questa implementazione di htmlDecode eliminerà qualsiasi spazio bianco aggiuntivo. Quindi, per alcuni valori di "input", input! = HtmlDecode (htmlEncode (input)). Questo è stato un problema per noi in alcuni scenari. Ad esempio, se input = "<p> \ t Hi \ n There </p>", una codifica / decodifica di andata e ritorno produrrà "<p> Hi There </p>". Il più delle volte va bene, ma a volte no. :)
pettys

7
Grazie per la soluzione! Ho risolto il problema dell'eliminazione degli spazi bianchi sostituendo nuove righe con %% NL %% simile nel valore di testo, quindi chiamato .html () per ottenere il valore codificato HTML, quindi sostituito %% NL %% con <br /> ' s ... Non a prova di proiettile ma ha funzionato e i miei utenti non avrebbero potuto digitare in %% NL %%.
benno,

1
La cosa divertente è che CSS ha una white-spaceproprietà, che suggerisce come devono essere elaborati gli spazi nel contenuto HTML. La presunzione della proprietà implica che "questo è preformattato, gli spazi e le interruzioni di linea dovrebbero essere preservati". Ciò interrompe la separazione di stile e contenuto, perché se si tenta di riformattare l'HTML in modo che sia "carino" o si ritorni in un ciclo di codifica / decodifica come questo, le sequenze di spazi / interruzioni si riducono e il codificatore non ha modo di sapere se era OK farlo, perché non è a conoscenza white-space:pre-*;dell'indicatore in un file CSS esterno!
Triynko,

2
Questa soluzione potrebbe dipendere dal fatto che la pagina sia scritta come html o xhtml, quindi preferirei una soluzione che non coinvolga il DOM.
Phil H,

30
Sebbene abbia ricevuto risposta due anni dopo, la risposta di @Anentropic di seguito è migliore sotto tutti gli aspetti.
Ciad

559

Il trucco di jQuery non codifica le virgolette e in IE spoglia il tuo spazio bianco.

Basandomi sulla escape templatetag di Django, che immagino sia già ampiamente utilizzata / testata, ho realizzato questa funzione che fa ciò che è necessario.

È probabilmente più semplice (e forse più veloce) di qualsiasi soluzione alternativa per il problema di stripping degli spazi bianchi e codifica le virgolette, che è essenziale se, ad esempio, utilizzerai il risultato all'interno di un valore di attributo.

function htmlEscape(str) {
    return str
        .replace(/&/g, '&amp;')
        .replace(/"/g, '&quot;')
        .replace(/'/g, '&#39;')
        .replace(/</g, '&lt;')
        .replace(/>/g, '&gt;');
}

// I needed the opposite function today, so adding here too:
function htmlUnescape(str){
    return str
        .replace(/&quot;/g, '"')
        .replace(/&#39;/g, "'")
        .replace(/&lt;/g, '<')
        .replace(/&gt;/g, '>')
        .replace(/&amp;/g, '&');
}

Aggiornamento 17/06/2013:
nella ricerca dell'evasione più rapida ho trovato l'implementazione di un replaceAllmetodo:
http://dumpsite.com/forum/index.php?topic=4.msg29#msg29
(indicato anche qui: Il più veloce metodo per sostituire tutte le istanze di un carattere in una stringa )
Alcuni risultati delle prestazioni qui:
http://jsperf.com/htmlencoderegex/25

Fornisce una stringa di risultati identica alle replacecatene incorporate sopra. Sarei molto felice se qualcuno potesse spiegare perché è più veloce !?

Aggiornamento 2015-03-04:
Ho appena notato che AngularJS sta usando esattamente il metodo sopra:
https://github.com/angular/angular.js/blob/v1.3.14/src/ngSanitize/sanitize.js#L435

Aggiungono un paio di perfezionamenti: sembrano gestire un oscuro problema Unicode e convertire tutti i caratteri non alfanumerici in entità. Ho avuto l'impressione che quest'ultimo non fosse necessario finché hai specificato un set di caratteri UTF8 per il tuo documento.

Noterò che (4 anni dopo) Django non fa ancora nessuna di queste cose, quindi non sono sicuro di quanto siano importanti:
https://github.com/django/django/blob/1.8b1/django/utils /html.py#L44

Aggiornamento 06-04-2016:
potresti anche voler sfuggire alla barra /. Ciò non è necessario per una corretta codifica HTML, tuttavia è raccomandato da OWASP come misura di sicurezza anti-XSS. (grazie a @JNF per aver suggerito questo nei commenti)

        .replace(/\//g, '&#x2F;');

3
Puoi anche usare &apos;invece di&#39;
Ferruccio il


5
Grazie, non ho mai capito che &apos;non è un'entità HTML valida.
Ferruccio,

10
Senza il /g, .replace()sostituirà solo la prima partita.
ThinkingStiff,

1
@ Tracker1 Non sono d'accordo, se la funzione riceve input non validi dovrebbe generare un errore. Se in un caso d'uso specifico si desidera gestire input non validi in quel modo, verificare il valore prima di chiamare la funzione o racchiudere la chiamata di funzione in un tentativo / catch.
Anentropico

80

Ecco una versione non jQuery che è notevolmente più veloce sia della .html()versione jQuery che della .replace()versione. Ciò preserva tutti gli spazi bianchi, ma come la versione jQuery, non gestisce le virgolette.

function htmlEncode( html ) {
    return document.createElement( 'a' ).appendChild( 
        document.createTextNode( html ) ).parentNode.innerHTML;
};

Velocità: http://jsperf.com/htmlencoderegex/17

test di velocità

demo: jsFiddle

Produzione:

produzione

script:

function htmlEncode( html ) {
    return document.createElement( 'a' ).appendChild( 
        document.createTextNode( html ) ).parentNode.innerHTML;
};

function htmlDecode( html ) {
    var a = document.createElement( 'a' ); a.innerHTML = html;
    return a.textContent;
};

document.getElementById( 'text' ).value = htmlEncode( document.getElementById( 'hidden' ).value );

//sanity check
var html = '<div>   &amp; hello</div>';
document.getElementById( 'same' ).textContent = 
      'html === htmlDecode( htmlEncode( html ) ): ' 
    + ( html === htmlDecode( htmlEncode( html ) ) );

HTML:

<input id="hidden" type="hidden" value="chalk    &amp; cheese" />
<input id="text" value="" />
<div id="same"></div>

17
Questo pone la domanda: perché non è già una funzione globale in JS ?!
SEoF

2
la .replace()versione non regex recentemente suggerita da @SEoF risulta essere molto più veloce: jsperf.com/htmlencoderegex/22
Anentropic

@Anentropic Questo si sta davvero illuminando velocemente, ma non credo che funzioni. Senza /g, .replace()sta facendo solo la prima partita.
ThinkingStiff,

è interessante replace('a', 'b', 'g')replace(/a/g, 'b')
notare che

1
nemmeno io :) Ho iniziato volendo solo gestire le virgolette e sono finito in una ricerca di velocità ...
Anentropic

32

So che questo è vecchio, ma volevo pubblicare una variante della risposta accettata che funzionerà in IE senza rimuovere le righe:

function multiLineHtmlEncode(value) {
    var lines = value.split(/\r\n|\r|\n/);
    for (var i = 0; i < lines.length; i++) {
        lines[i] = htmlEncode(lines[i]);
    }
    return lines.join('\r\n');
}

function htmlEncode(value) {
    return $('<div/>').text(value).html();
} 


12

Buona risposta. Nota che se il valore da codificare è undefinedo nullcon jQuery 1.4.2 potresti ricevere errori come:

jQuery("<div/>").text(value).html is not a function

O

Uncaught TypeError: Object has no method 'html'

La soluzione è modificare la funzione per verificare un valore effettivo:

function htmlEncode(value){ 
    if (value) {
        return jQuery('<div/>').text(value).html(); 
    } else {
        return '';
    }
}

8
jQuery('<div/>').text(value || '').html()
roufamatic,

3
@roufamatic - Nice one-liner. Ma controllare per un non vuoto valuecon un ifsalvataggio deve creare un DIV al volo e afferrare il suo valore. Questo può essere molto più performante se htmlEncodeviene chiamato molto E se è probabile che valuesarà vuoto.
Leepowers,

Ciao, non fa da β a & beta sai perché?
Dilip Rajkumar,

11

Per coloro che preferiscono il semplice javascript, ecco il metodo che ho usato con successo:

function escapeHTML (str)
{
    var div = document.createElement('div');
    var text = document.createTextNode(str);
    div.appendChild(text);
    return div.innerHTML;
}

6

FWIW, la codifica non viene persa. La codifica viene utilizzata dal parser di markup (browser) durante il caricamento della pagina. Una volta che l'origine viene letta e analizzata e il browser ha il DOM caricato in memoria, la codifica è stata analizzata in ciò che rappresenta. Quindi quando il tuo JS viene eseguito per leggere qualsiasi cosa in memoria, il carattere che ottiene è ciò che rappresentava la codifica.

Potrei operare rigorosamente sulla semantica qui, ma volevo che capissi lo scopo della codifica. La parola "perso" fa sembrare che qualcosa non funzioni come dovrebbe.


6

Più veloce senza Jquery. Puoi codificare tutti i caratteri nella tua stringa:

function encode(e){return e.replace(/[^]/g,function(e){return"&#"+e.charCodeAt(0)+";"})}

Oppure scegli come target i personaggi principali di cui preoccuparti (&, inebreaks, <,>, "e ') come:

function encode(r){
return r.replace(/[\x26\x0A\<>'"]/g,function(r){return"&#"+r.charCodeAt(0)+";"})
}

test.value=encode('Encode HTML entities!\n\n"Safe" escape <script id=\'\'> & useful in <pre> tags!');

testing.innerHTML=test.value;

/*************
* \x26 is &ampersand (it has to be first),
* \x0A is newline,
*************/
<textarea id=test rows="9" cols="55"></textarea>

<div id="testing">www.WHAK.com</div>


5

Prototype ha incorporato la classe String . Quindi se stai usando / piano per usare Prototype, fa qualcosa del tipo:

'<div class="article">This is an article</div>'.escapeHTML();
// -> "&lt;div class="article"&gt;This is an article&lt;/div&gt;"

9
Dopo aver esaminato la soluzione di Prototype, questo è tutto ciò che sta facendo ... .replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;'); Abbastanza facile.
Steve Wortham,

5
non dovrebbe fare qualcosa anche con virgolette? non va bene
Anentropic

@Anentropico Non vedo perché dovrebbe fare qualcosa con le virgolette; poiché le virgolette non devono essere salvate a meno che non si trovino all'interno di un valore di attributo.
Andy,

OK dopo qualche riflessione riprendo quel commento - se stai costruendo un pezzo di HTML vorresti codificare ogni parte di esso compresi i valori degli attributi, quindi sono d'accordo con Anentropic e non penso che la funzione Prototypejs sia sufficiente in questo caso.
Andy,

4

Ecco una semplice soluzione javascript. Estende l'oggetto String con un metodo "HTMLEncode" che può essere utilizzato su un oggetto senza parametro o con un parametro.

String.prototype.HTMLEncode = function(str) {
  var result = "";
  var str = (arguments.length===1) ? str : this;
  for(var i=0; i<str.length; i++) {
     var chrcode = str.charCodeAt(i);
     result+=(chrcode>128) ? "&#"+chrcode+";" : str.substr(i,1)
   }
   return result;
}
// TEST
console.log("stetaewteaw æø".HTMLEncode());
console.log("stetaewteaw æø".HTMLEncode("æåøåæå"))

Ho creato un "metodo HTMLEncode per javascript" .


3

Basato su sanificazione di angular ... (sintassi del modulo es6)

// ref: https://github.com/angular/angular.js/blob/v1.3.14/src/ngSanitize/sanitize.js
const SURROGATE_PAIR_REGEXP = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
const NON_ALPHANUMERIC_REGEXP = /([^\#-~| |!])/g;

const decodeElem = document.createElement('pre');


/**
 * Decodes html encoded text, so that the actual string may
 * be used.
 * @param value
 * @returns {string} decoded text
 */
export function decode(value) {
  if (!value) return '';
  decodeElem.innerHTML = value.replace(/</g, '&lt;');
  return decodeElem.textContent;
}


/**
 * Encodes all potentially dangerous characters, so that the
 * resulting string can be safely inserted into attribute or
 * element text.
 * @param value
 * @returns {string} encoded text
 */
export function encode(value) {
  if (value === null || value === undefined) return '';
  return String(value).
    replace(/&/g, '&amp;').
    replace(SURROGATE_PAIR_REGEXP, value => {
      var hi = value.charCodeAt(0);
      var low = value.charCodeAt(1);
      return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';';
    }).
    replace(NON_ALPHANUMERIC_REGEXP, value => {
      return '&#' + value.charCodeAt(0) + ';';
    }).
    replace(/</g, '&lt;').
    replace(/>/g, '&gt;');
}

export default {encode,decode};

Mentre mi piace davvero questa risposta e in realtà penso che sia un buon approccio, ho dei dubbi, l'operatore bit a bit su if (value === null | value === undefined) return '';un errore di battitura o in realtà è una caratteristica? Se è così, perché usare quello e non il comune ||? Grazie!!
Alejandro Vales,

1
@AlejandroVales Sono abbastanza sicuro che fosse un errore di battitura ... corretto.
Tracker 1

1
Bene comunque tieni presente che il | porterà a 0 o 1, quindi in realtà ha funzionato ^^
Alejandro Vales,

non potresti semplicemente usare == null? undefinedè l'unica cosa con cui avere equivalenza null, quindi non sono necessarie due triple uguali
Hashbrown,

non è affatto vero. nulle 0sono entrambi falsi, sì, quindi non puoi semplicemente farlo !value, ma il punto ==è rendere alcune cose più facili. 0 == nullè falso. undefined == nullè vero. puoi semplicemente farevalue == null
Hashbrown,

3

Per quanto ne so, non esiste alcun metodo di codifica / decodifica HTML semplice in javascript.

Tuttavia, ciò che puoi fare è usare JS per creare un elemento arbitrario, impostare il suo testo interno, quindi leggerlo usando innerHTML.

Diciamo, con jQuery, questo dovrebbe funzionare:

var helper = $('chalk & cheese').hide().appendTo('body');
var htmled = helper.html();
helper.remove();

O qualcosa del genere.


Trovo il downvote un po 'divertente, considerando che questa risposta è quasi identica a quella che ha oltre 870 voti, ed è stata postata un po' dopo questa.
Ken Egozi,

2

Non dovresti dover sfuggire / codificare i valori per spostarli da un campo di input a un altro.

<form>
 <input id="button" type="button" value="Click me">
 <input type="hidden" id="hiddenId" name="hiddenId" value="I like cheese">
 <input type="text" id="output" name="output">
</form>
<script>
    $(document).ready(function(e) {
        $('#button').click(function(e) {
            $('#output').val($('#hiddenId').val());
        });
    });
</script>

JS non va inserendo HTML grezzo o altro; dice semplicemente al DOM di impostare la valueproprietà (o l'attributo; non sono sicuro). In entrambi i casi, il DOM gestisce eventuali problemi di codifica. A meno che tu non stia facendo qualcosa di strano come usare document.writeo eval, la codifica HTML sarà effettivamente trasparente.

Se stai parlando di generare una nuova casella di testo per contenere il risultato ... è ancora facile. Basta passare la parte statica dell'HTML a jQuery, quindi impostare il resto delle proprietà / attributi sull'oggetto che ti viene restituito.

$box = $('<input type="text" name="whatever">').val($('#hiddenId').val());

2

Ho avuto un problema simile e risolverlo utilizzando la funzione encodeURIComponentdi JavaScript ( documentazione )

Ad esempio, nel tuo caso se usi:

<input id='hiddenId' type='hidden' value='chalk & cheese' />

e

encodeURIComponent($('#hiddenId').attr('value'))

otterrai chalk%20%26%20cheese. Anche gli spazi sono mantenuti.

Nel mio caso, ho dovuto codificare una barra rovesciata e questo codice funziona perfettamente

encodeURIComponent('name/surname')

e ho ottenuto name%2Fsurname


2

Ecco un po 'che emula la Server.HTMLEncodefunzione dall'ASP di Microsoft, scritto in puro JavaScript:

function htmlEncode(s) {
  var ntable = {
    "&": "amp",
    "<": "lt",
    ">": "gt",
    "\"": "quot"
  };
  s = s.replace(/[&<>"]/g, function(ch) {
    return "&" + ntable[ch] + ";";
  })
  s = s.replace(/[^ -\x7e]/g, function(ch) {
    return "&#" + ch.charCodeAt(0).toString() + ";";
  });
  return s;
}

Il risultato non codifica gli apostrofi, ma codifica gli altri speciali HTML e qualsiasi carattere al di fuori dell'intervallo 0x20-0x7e.


2

La mia funzione pure-JS:

/**
 * HTML entities encode
 *
 * @param {string} str Input text
 * @return {string} Filtered text
 */
function htmlencode (str){

  var div = document.createElement('div');
  div.appendChild(document.createTextNode(str));
  return div.innerHTML;
}

Entità HTML JavaScript codificate e decodificate


1

Se si desidera utilizzare jQuery. Ho trovato questo:

http://www.jquerysdk.com/api/jQuery.htmlspecialchars

(parte del plug-in jquery.string offerto da jQuery SDK)

Credo che il problema con Prototype estenda gli oggetti di base in JavaScript e sarà incompatibile con qualsiasi jQuery che potresti aver usato. Naturalmente, se stai già utilizzando Prototype e non jQuery, non sarà un problema.

EDIT: C'è anche questo, che è una porta delle utility di stringa di Prototype per jQuery:

http://stilldesigning.com/dotstring/


1
var htmlEnDeCode = (function() {
    var charToEntityRegex,
        entityToCharRegex,
        charToEntity,
        entityToChar;

    function resetCharacterEntities() {
        charToEntity = {};
        entityToChar = {};
        // add the default set
        addCharacterEntities({
            '&amp;'     :   '&',
            '&gt;'      :   '>',
            '&lt;'      :   '<',
            '&quot;'    :   '"',
            '&#39;'     :   "'"
        });
    }

    function addCharacterEntities(newEntities) {
        var charKeys = [],
            entityKeys = [],
            key, echar;
        for (key in newEntities) {
            echar = newEntities[key];
            entityToChar[key] = echar;
            charToEntity[echar] = key;
            charKeys.push(echar);
            entityKeys.push(key);
        }
        charToEntityRegex = new RegExp('(' + charKeys.join('|') + ')', 'g');
        entityToCharRegex = new RegExp('(' + entityKeys.join('|') + '|&#[0-9]{1,5};' + ')', 'g');
    }

    function htmlEncode(value){
        var htmlEncodeReplaceFn = function(match, capture) {
            return charToEntity[capture];
        };

        return (!value) ? value : String(value).replace(charToEntityRegex, htmlEncodeReplaceFn);
    }

    function htmlDecode(value) {
        var htmlDecodeReplaceFn = function(match, capture) {
            return (capture in entityToChar) ? entityToChar[capture] : String.fromCharCode(parseInt(capture.substr(2), 10));
        };

        return (!value) ? value : String(value).replace(entityToCharRegex, htmlDecodeReplaceFn);
    }

    resetCharacterEntities();

    return {
        htmlEncode: htmlEncode,
        htmlDecode: htmlDecode
    };
})();

Questo proviene dal codice sorgente di ExtJS.


1
<script>
String.prototype.htmlEncode = function () {
    return String(this)
        .replace(/&/g, '&amp;')
        .replace(/"/g, '&quot;')
        .replace(/'/g, '&#39;')
        .replace(/</g, '&lt;')
        .replace(/>/g, '&gt;');

}

var aString = '<script>alert("I hack your site")</script>';
console.log(aString.htmlEncode());
</script>

Uscita: &lt;script&gt;alert(&quot;I hack your site&quot;)&lt;/script&gt;

.htmlEncode () sarà accessibile su tutte le stringhe una volta definite.


1

Html: codifica il valore dato

  var htmlEncodeContainer = $('<div />');
  function htmlEncode(value) {
    if (value) {
      return htmlEncodeContainer.text(value).html();
    } else {
      return '';
    }
  }


0

Scegliere cosa escapeHTML()sta facendo in prototype.js

L'aggiunta di questo script ti aiuta a fuggire HTML:

String.prototype.escapeHTML = function() { 
    return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;')
}

ora puoi chiamare il metodo escapeHTML sulle stringhe del tuo script, come:

var escapedString = "<h1>this is HTML</h1>".escapeHTML();
// gives: "&lt;h1&gt;this is HTML&lt;/h1&gt;"

Spero che aiuti chiunque cerchi una soluzione semplice senza dover includere l'intero prototype.js


0

Usando alcune delle altre risposte qui ho realizzato una versione che sostituisce tutti i caratteri pertinenti in un passaggio, indipendentemente dal numero di caratteri codificati distinti (solo una chiamata a replace()), quindi sarà più veloce per stringhe più grandi.

Non si basa sull'esistenza dell'API DOM o su altre librerie.

window.encodeHTML = (function() {
    function escapeRegex(s) {
        return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
    }
    var encodings = {
        '&'  : '&amp;',
        '"'  : '&quot;',
        '\'' : '&#39;',
        '<'  : '&lt;',
        '>'  : '&gt;',
        '\\' : '&#x2F;'
    };
    function encode(what) { return encodings[what]; };
    var specialChars = new RegExp('[' +
        escapeRegex(Object.keys(encodings).join('')) +
    ']', 'g');

    return function(text) { return text.replace(specialChars, encode); };
})();

Dopo averlo eseguito una volta, ora puoi chiamare

encodeHTML('<>&"\'')

Ottenere &lt;&gt;&amp;&quot;&#39;


0

function encodeHTML(str) {
    return document.createElement("a").appendChild( 
        document.createTextNode(str)).parentNode.innerHTML;
};

function decodeHTML(str) {
    var element = document.createElement("a"); 
    element.innerHTML = str;
    return element.textContent;
};
var str = "<"
var enc = encodeHTML(str);
var dec = decodeHTML(enc);
console.log("str: " + str, "\nenc: " + enc, "\ndec: " + dec);

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.