2012-01-05 17 views
36

ho bisogno di scappare apici nei parametri di funzione JavaScript per evitare questo:fuga singola citazione in funzione JavaScript parametri

onclick="Javascript:INSERT_PRODUCT('188267','WILL AND GRACE','32311','L'ANNIVERSARIO DINOZZE ','20101113|04|18|','13/11/2010 0.00.00','CANALE 5 ',this);" 

ma ho bisogno di sfuggire al loro interno una chiamata di funzione dato che non conosco i valori che essere passato (variabili db non posso uscire dal database).

C'è una funzione che mi consente di fare qualcosa di simile al seguente?

onclick="Javascript:function(escape(param1), escape(param2), escape(param3));" 
+3

' '' = '\'' (proprio come si farebbe con un normale stringa). E poiché lo stai inserendo nel markup, o tu dovresti scappare da esso o se un linguaggio sul lato server lo sta generando assicurati che _it_ lo sfugga. –

+0

È possibile inserire i parametri all'interno di 'escape (param)' –

+4

L'etichetta 'Javascript:' non è necessaria lì. Dovresti usare altri modi per associare i gestori di eventi: http://www.quirksmode.org/js/introevents.html, quindi non devi preoccuparti delle citazioni. –

risposta

9

fuga l'apostrofo con un backslash:

onclick="INSERT_PRODUCT('188267','WILL AND GRACE ','32311','L\'ANNIVERSARIO DI NOZZE ','20101113|04|18|','13/11/2010 0.00.00','CANALE 5 ',this);" 
+4

rimuovere il 'Javascript:'. Non è sbagliato metterlo lì, ma è inutile e gli sviluppatori meno esperti potrebbero pensare che sia necessario. –

+2

Ho bisogno di una funzione per eseguire l'escape all'interno della chiamata myfunction poiché è l'unico posto a cui posso accedere. Qualche suggerimento? –

+0

Questo fallirà se la stringa contiene '" ','  ', '\' o qualsiasi altra entità che codifica virgolette singole o doppie o backslash. Ad esempio, la stringa' 'foo' 'onmouseover = alert (1) 'non contiene citazione singola, ma quando incorporato in un attributo HTML, sfrutta una vulnerabilità XSS. Allo stesso modo, ''foo \' fallirà, perché il parser JavaScript vedrà '\', non '\' quindi la citazione di chiusura verrà interpretata come parte della stringa, quindi se il valore di stringa successivo è 'alert (1))// ', quindi verrà trattato come JavaScript letterale, con conseguente esecuzione arbitraria di script. –

18
JSON.stringify(plainTextStr).replace(/&/, "&").replace(/"/g, """) 

produrrà una stringa si può tranquillamente inserire in un attributo citata e che avrà lo stesso significato se visto dall'interprete JavaScript.

L'unica avvertenza è che alcuni Unicode nuove righe (U + 2028 e U + 2029) need to be escaped prima di essere incorporato in JavaScript stringhe letterali, ma JSON richiede solo che \r e \n essere sfuggito.

0

Se ti sto capendo correttamente, non credo che ciò che stai cercando di fare sia possibile. Dovrai sfuggire alle virgolette sul lato server. Qualsiasi funzione che eviterebbe le virgolette per voi, sarebbe di per sé una funzione che richiede una stringa valida, il che significa che dovrebbe essere preceduta da una passata prima di essere passata alla funzione.

7

Forse non è completamente chiaro dalla domanda, ma partendo dal presupposto che tutto ciò che si desidera sia inviare a uno script PHP per l'archiviazione in un database, si utilizzerebbe idealmente i vari metodi di PHP come stripslashes() - ma se si Non stiamo davvero cercando di diventare troppo fantasiosi, semplicemente aggiungendo 1 barra di fronte a ogni singola quota è sufficiente inviare una query SQL direttamente in PHP dal lato client. È non sicuro, ma forse non è necessario neanche.

str.replace(/'/g, "\\'"); // escaping \ with \, so used 2x 

fa il trucco, come per esempio in qualcosa di simile a questo:.

var body = $('#body').val().replace(/'/g, "\\'"); 
myCustomSQLqueryFunction("UPDATE mytable SET `content`='"+ body +"';"); 

MySQL sarà ora memorizzare il body come si vede nel campo modulo.

+0

Stavo testando questo e ho notato che MySQL rimuove semplicemente le virgolette singole come 'così dovresti sfuggire anche a quelle. – tim

3

Questa funzione ha funzionato per me (rimuove e ripristina la citazione di nuovo): indovinando che i dati da trasmettere è il valore di un elemento di input,

var Url = encodeURIComponent($('#userInput').val().replace("'","\\'")); 

si metterà subito di nuovo il testo originale:

var originalText = decodeURIComponent(Url); 
1
var cmpdetail = cmpdetail.replace(/'/g, "\\'"); 

il suo lavoro per me.

0

Preferisco utilizzare la virgoletta singola per definire stringhe JavaScript. Quindi sfuggo le mie doppie virgolette come segue.

Questo è il modo in cui 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\"
<span id="output"></span>

Problemi correlati