2012-08-27 8 views
5

Ho un elemento con un attributo rel che contiene una stringa JSON, qualcosa di simile:valore JSON con apostrofo

rel='{"id":"#id#","name":"#name#"}' 

Poi, nel mio codice javascript, io uso $.parseJSON analizzare questi dati. Funziona correttamente, inoltre per i casi in cui name contiene un apostrofo. Ho provato a utilizzare jsStringFormat, un coldfusion replace che sostituisce tutte le virgolette singole con virgolette singole sfuggite, ecc, ma non riesco a trovare una soluzione corretta. So che questo è probabilmente semplice, ma come faccio a ottenere il codice per passare correttamente i valori con apostropes/virgolette singole usando json?

Questo codice funziona, ma elimina gli apostrofi, che mi piacerebbe conservare:

rel='{"id":"#id#","name":"#replace(name,"'","","all")#"}' 

Questo non funziona:

rel='{"id":"#id#","name":"#replace(name,"'","\'","all")#"}' 

Né:

rel='{"id":"#id#","name":"#replace(name,"'","\\\'","all")#"}' 

Or :

rel='{"id":"#id#","name":"#replace(name,"'",""","all")#"}' 

Oppure:

rel='{"id":"#id#","name":"#jsStringFormat(name)#"}' 
+0

Per evitare correttamente le virgolette negli attributi HTML, utilizzare '"' – cspolton

+1

Perché non si può semplicemente usare [serializeJson] (http://cfdocs.org/serializeJson)? –

risposta

4

Dopo un sacco di suonare in giro, ho finalmente avuto questo lavoro :)

rel='{"id":"#id#","name":"#replace(name,"'","&##39;","all")#"}' 
+0

Questa risposta è un trucco e non dovrebbe essere la soluzione consigliata. Risolve il problema con l'apostrofo, ma consente comunque altri caratteri non validi nell'output. per esempio. se "nome" ha una e commerciale in esso. La risposta corretta è codificare correttamente le stringhe per il contesto in cui vengono utilizzate. – nosilleg

1

In JavaScript, fuga apici nelle stringhe con \.

In HTML, si dovrebbe davvero usare le virgolette per gli attributi, però, e la fuga le virgolette, per esempio:

rel="{"id":"#id#","name":"#name#"}" 
+0

Uso una variabile coldfusion, non letterale. I segni di cancelletto indicano la variabile – froadie

+0

@froadie: ho modificato l'esempio per riflettere le variabili. – cspolton

+0

che non funziona, non penso sia corretto Sintassi JSON – froadie

2

Il problema riscontrato è che si tratta di una stringa in due contesti. È necessario assicurarsi che la stringa sia sicura in entrambi.

JSON stringa:

Il modo più semplice per rendere il codice JSON sicuro è quello di usare SerializeJSON function per convertire un oggetto di ColdFusion in JSON valido.

Così il vostro codice potrebbe diventare:

rel='#SerializeJSON({"id"=Variables.id,"name"=Variables.name})#' 

HTML stringa di attributo:

La prossima contesto che è necessario affrontare con è che si desidera che la stringa da un valore attributo HTML valido.

In ColdFusion 10 è possibile gestirlo con EncodeForHTMLAttribute function.

Se si utilizza qualcosa prima di CF10, utilizzare il codificatore ESAPI è la soluzione migliore.(Questo è stato incluso con patches on some versions of ColdFusion)

rel='#CreateObject("java", "org.owasp.esapi.ESAPI").encoder().encodeForHTMLAttribute(SerializeJSON({"id"=Variables.id,"name"=Variables.name}))#' 

io personalmente uso un aiutante CFC a che fare con encoder ESAPI in CF9, così CreateObject viene chiamato una sola volta e riutilizzato per tutti gli usi dei suoi metodi.

Problemi correlati