2012-08-27 15 views
5

Mam element z atrybutem rel który zawiera ciąg JSON, coś jak:wartość JSON z apostrof

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

Następnie w kodzie JavaScript, używam $.parseJSON analizować te dane. Działa to poprawnie - oprócz przypadków, w których name zawiera apostrof. Próbowałem używać jsStringFormat, coldfusion replace, który zastępuje wszystkie pojedyncze cudzysłowy z unikalnymi pojedynczymi cudzysłowami itp., Ale nie mogę znaleźć poprawnego rozwiązania. Wiem, że to najprawdopodobniej proste, ale w jaki sposób uzyskać poprawne przekazywanie wartości za pomocą apostrofów/pojedynczych cudzysłowów za pomocą json?

Ten kod działa, ale eliminuje apostrof które chciałbym zachować:

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

To nie działa:

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

Ani też:

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

Or :

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

Lub:

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

Aby poprawnie uniknąć podwójnych cudzysłowów w atrybutach HTML, należy użyć '"' – cspolton

+1

Dlaczego nie można po prostu użyć [serializeJson] (http://cfdocs.org/serializeJson)? –

Odpowiedz

4

Po mnóstwem zabawy, w końcu dostał to zadziałało :)

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

Ta odpowiedź jest hackerem i nie powinna być zalecanym rozwiązaniem. Rozwiązuje problem z apostrofem, ale nadal dopuszcza inne nieprawidłowe znaki na wyjściu. na przykład jeśli "nazwa" ma w sobie znak ampersand. Poprawną odpowiedzią jest prawidłowe kodowanie ciągów dla kontekstu, w którym są używane. – nosilleg

1

W JavaScript, ucieczka apostrofów w łańcuchach z \.

W HTML, naprawdę powinieneś używać cudzysłowów dla atrybutów choć i uciec cudzysłowia, np:

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

Używam zmiennej coldfusion, a nie literału. Znaki funtowe oznaczają zmienną – froadie

+0

@froadie: zmieniłem przykład, aby odzwierciedlić twoje zmienne. – cspolton

+0

to nie działa, nie sądzę, że jest poprawna składnia JSON – froadie

2

Problem, który masz, polega na tym, że masz do czynienia z łańcuchem w dwóch kontekstach. Musisz upewnić się, że ciąg jest bezpieczny w obu.

JSON ciąg:

Najprostszym sposobem, aby JSON bezpieczne jest stosowanie SerializeJSON function konwertować obiekt JSON ColdFusion do ważnego.

Zatem kod może stać:

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

HTML atrybut ciąg:

Kolejny kontekst, że trzeba zająć się jest to, że chcesz ciąg być ważna wartość atrybutu html.

W ColdFusion 10 można sobie z tym poradzić z EncodeForHTMLAttribute function.

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

Jeśli używasz czegoś przed CF10, to najlepszym rozwiązaniem jest użycie kodera ESAPI.(To był dołączony patches on some versions of ColdFusion)

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

Osobiście używam pomocnika CFC do czynienia z ESAPI kodera w CF9, więc CreateObject jest wywoływana tylko raz i ponownie użyte do wszystkich zastosowań swoich metod.

Powiązane problemy