Fuga cita in JavaScript

Sto emettendo valori da un database (non è realmente aperto al pubblico, ma è aperto alla voce da un utente presso l’azienda – cioè, non sono preoccupato per XSS .)

Sto cercando di produrre un tag come questo:

Click Me 

DESCRIZIONE è in realtà un valore dal database che è qualcosa del genere:

 Prelim Assess "Mini" Report 

Ho provato a sostituire “with \”, ma non importa quello che provo, Firefox continua a tagliare la mia chiamata JavaScript dopo lo spazio dopo la parola Assess , e sta causando tutti i tipi di problemi.

Devo bemettere la risposta ovvia, ma per la vita di me non riesco a capirlo.

Qualcuno si preoccupa di sottolineare la mia idiozia?

Ecco l’intera pagina HTML (alla fine sarà una pagina ASP.NET , ma per risolverlo ho eliminato tutto il resto tranne il codice problema)

   edit   

Devi sfuggire alla stringa che stai scrivendo in DoEdit per eliminare i caratteri a doppia virgoletta. Stanno causando la chiusura prematura dell’attributo HTML onclick .

L’utilizzo del carattere di escape JavaScript, \ , non è sufficiente nel contesto HTML. È necessario sostituire la doppia virgoletta con la rappresentazione dell’entity framework XML appropriata, " .

" funzionerebbe in questo caso particolare, come suggerito prima di me, a causa del contesto HTML.

Tuttavia, se desideri che il tuo codice JavaScript sia indipendente di escape per qualsiasi contesto, puoi scegliere la codifica JavaScript nativa:
' diventa \x27
" diventa \x22

Quindi il tuo onclick diventerebbe:
DoEdit('Preliminary Assessment \x22Mini\x22');

Ciò funzionerebbe, ad esempio, anche quando si passa una stringa JavaScript come parametro ad un altro metodo JavaScript ( alert() è un metodo di prova semplice per questo).

Ti sto riferendo alla duplice domanda Stack Overflow, Come faccio a sfuggire a una stringa all’interno del codice JavaScript all’interno di un gestore onClick? .

   edit   

Dovrebbe fare il trucco.

Gente, c’è già la funzione di unescape in JavaScript che esegue l’escape di \" :

  

Il problema è che HTML non riconosce il carattere di escape. Puoi ovviare a ciò usando le virgolette singole per l’attributo HTML e le virgolette per l’onclick.

 edit 

Se stai assemblando l’HTML in Java, puoi usare questa bella class di utilità da Apache commons-lang per eseguire correttamente l’escaping:

org.apache.commons.lang.StringEscapeUtils
Escapes e unescapes di stringhe per Java, script Java, HTML, XML e SQL.

Ecco come lo faccio, in pratica str.replace(/[\""]/g, '\\"') .

 var display = document.getElementById('output'); var str = 'class="whatever-foo__input" id="node-key"'; display.innerHTML = str.replace(/[\""]/g, '\\"'); //will return class=\"whatever-foo__input\" id=\"node-key\" 
  

Ne ho fatto un esempio usando jQuery

 var descr = 'test"inside"outside'; $(function(){ $("#div1").append('Click Me'); }); function DoEdit(desc) { alert ( desc ); } 

E questo funziona in Internet Explorer e Firefox.

Si prega di trovare nel codice sottostante che sfugge le virgolette singole come parte della stringa inserita utilizzando l’espressione regolare. Convalida se la stringa inserita dall’utente è separata da virgola e allo stesso tempo sfugge anche a una singola virgoletta inserita come parte della stringa. Per sfuggire alla citazione singola basta inserire la barra rovesciata seguita da una virgoletta singola come: \ ‘ come parte della stringa. Ho usato il validatore JQuery per questo esempio che puoi usare come da trasporto.

Esempi di stringhe valide:

‘Ciao’

‘Ciao mondo’

‘Ciao mondo’

‘Ciao mondo’,’ ‘

‘E’ il mio mondo ‘,’ Non posso godermi questo senza di me. ‘,’ Benvenuto, Ospite ‘

HTML:

    

JavaScript:

  /** * * @param {type} param1 * @param {type} param2 * @param {type} param3 */ jQuery.validator.addMethod('commaSeparatedText', function(value, element) { if (value.length === 0) { return true; } var expression = new RegExp("^((')([^\'\\\\]*(?:\\\\.[^\'\\\\])*)[\\w\\s,\\.\\-_\\[\\]\\)\\(]+([^\'\\\\]*(?:\\\\.[^\'\\\\])*)('))(((,)|(,\\s))(')([^\'\\\\]*(?:\\\\.[^\'\\\\])*)[\\w\\s,\\.\\-_\\[\\]\\)\\(]+([^\'\\\\]*(?:\\\\.[^\'\\\\])*)('))*$"); return expression.test(value); }, 'Invalid comma seperated string values.'); 

Scappa anche gli spazi bianchi. Mi sembra che Firefox stia assumendo tre argomenti invece di uno.   è il carattere dello spazio senza interruzioni. Anche se non è l’intero problema, potrebbe essere comunque una buona idea.

Hai bisogno di sfuggire alle virgolette con doppi backslash.

Questo fallisce (prodotto da json_encode di PHP):

  

Questo funziona: