Muszę umieścić obiekt JSON w atrybucie elementu HTML.
Kod HTML nie musi sprawdzać poprawności.Odpowiedział Quentin: Przechowuj JSON w
data-*
atrybucie , który jest prawidłowym HTML5.Obiekt JSON może mieć dowolny rozmiar - tj. Ogromny
Odpowiedział Maiku Mori: Limit dla atrybutu HTML to potencjalnie 65536 znaków .
Co się stanie, jeśli JSON zawiera znaki specjalne? na przykład
{foo: '<"bar/>'}
Odpowiedział Quentin: Zakoduj ciąg JSON przed umieszczeniem go w atrybucie, zgodnie ze zwykłymi konwencjami. W przypadku PHP użyj funkcji .
htmlentities()
EDYCJA - Przykładowe rozwiązanie wykorzystujące PHP i jQuery
Zapisywanie JSON w atrybucie HTML:
<?php
$data = array(
'1' => 'test',
'foo' => '<"bar/>'
);
$json = json_encode($data);
?>
<a href="#" data-json="<?php echo htmlentities($json, ENT_QUOTES, 'UTF-8'); ?>">CLICK ME</a>
Pobieranie JSON za pomocą jQuery:
$('a').click(function() {
// Read the contents of the attribute (returns a string)
var data = $(this).data('json');
// Parse the string back into a proper JSON object
var json = $.parseJSON($(this).data('json'));
// Object now available
console.log(json.foo);
});
javascript
php
html
json
BadHorsie
źródło
źródło
data-json
którego powinieneś użyć$(this).data('json')
, jQuery ma cię w tej części.Odpowiedzi:
Dlaczego nie? Walidacja to naprawdę łatwa kontrola jakości, która wyłapuje wiele błędów. Użyj
data-*
atrybutu HTML 5 .Nie widziałem żadnej dokumentacji dotyczącej ograniczeń przeglądarek dotyczących rozmiarów atrybutów.
Jeśli napotkasz je, zapisz dane w pliku
<script>
. Zdefiniuj obiekt i przypisz elementid
s do nazw właściwości w tym obiekcie.Po prostu postępuj zgodnie ze zwykłymi regułami włączania niezaufanych danych do wartości atrybutów. Użyj
&
i"
(jeśli zawijasz wartość atrybutu w podwójne cudzysłowy) lub'
(jeśli zawijasz wartość atrybutu w pojedyncze cudzysłowy).Należy jednak pamiętać, że nie jest to format JSON (który wymaga, aby nazwy właściwości były ciągami, a ciągi były rozdzielane tylko podwójnymi cudzysłowami).
źródło
htmlentities($json)
zanim wstawię go do atrybutu HTML? A potem jak to zdekodować, gdy chcę to przeczytać w jQuery? A potem, jak mam to zapisać z powrotem w jQuery w taki sam sposób, jak w PHP?W zależności od tego, gdzie go umieścisz,
<div>
jak pytasz, trzeba upewnić się, że JSON nie zawiera specjalne HTML, który mógłby rozpocząć komentarz, tag HTML, wbudowany doctype, itd. Musisz uciec przynajmniej<
, i&
w taki sposób, że oryginalna postać nie pojawiają się w sekwencji ucieczki.<script>
elementach musisz upewnić się, że JSON nie zawiera tagu końcowego</script>
ani granicy ucieczki tekstu:<!--
lub-->
."
lub'
).W pierwszych dwóch przypadkach (i dla starych parserów JSON) należy zakodować U + 2028 i U + 2029, ponieważ są to znaki nowej linii w JavaScript, mimo że są dozwolone w ciągach niezakodowanych w JSON.
Aby uzyskać poprawność, musisz uciekać
\
i cytować znaki JSON i nigdy nie jest złym pomysłem zawsze kodować NUL.Jeśli kod HTML może być obsługiwany bez kodowania treści, należy kodować,
+
aby zapobiec atakom UTF-7 .W każdym razie poniższa tabela zmiany znaczenia będzie działać:
\u0000
\n
lub\u000a
\r
lub\u000d
"
->\u0022
&
->\u0026
'
->\u0027
+
->\u002b
/
->\/
lub\u002f
<
->\u003c
>
->\u003e
\
->\\
lub\u005c
\u2028
\u2029
Zatem wartość ciągu JSON dla tekstu
Hello, <World>!
z nową linią na końcu będzie"Hello, \u003cWorld\u003e!\r\n"
.źródło
return (input.replace(/([\s"'
& + \ / \\ <> \ u2028 \ u2029 \ u0000]) / g, (match, p1) => {return\\u${p1.codePointAt(0).toString(16).padStart(4, 0)}
; })); `Innym sposobem, w jaki możesz to zrobić, jest umieszczenie danych json w
<script>
tagu, ale nie za pomocątype="text/javascript"
, ale ztype="text/bootstrap"
lubtype="text/json"
typem, aby uniknąć wykonywania javascript.Następnie w jakimś miejscu swojego programu możesz poprosić o to w ten sposób:
Po stronie serwera możesz zrobić coś takiego (ten przykład z php i twig ):
źródło
<script type="application/json" id="MyData"></script>
działa idealnie. Następnie, używając ActiveWAFL / DblEj, mogę szukać go z:document.GetData("#MyData")
.<script type="application/json" id="MyData"> "abc</script><script>alert()</script>" </script>
Inną opcją jest kodowanie ciągu JSON przy użyciu base64 i jeśli chcesz go użyć w swoim javascript, zdekoduj go za pomocą
atob()
funkcji.źródło
atob
. Nigdy nie byłem tego świadomy!Możesz użyć knockoutjs,
knockout.js
Wynik
Imię: Jayson Nazwisko: Monterroso
Sprawdź to: http://learn.knockoutjs.com/
źródło
Nie ma tu nic nadzwyczajnego. W PHP przeprowadź ciąg JSON,
htmlspecialchars
aby upewnić się, że żadne znaki specjalne nie mogą być interpretowane jako HTML. Z Javascript nie trzeba uciekać; po prostu ustaw atrybut i gotowe.źródło
Poniższy kod zadziała w przypadku prostych obiektów JSON.
Kodować:
Rozszyfrować:
źródło
To, co możesz zrobić, to użyć cdata wokół swojego elementu / elementów w ten sposób
gdzie mydata to nieprzetworzony ciąg json. Mam nadzieję, że to pomoże tobie i innym.
źródło
">
w moich danych?Inną myślą, której można by użyć, jest zapisanie danych JSON jako ciągu base64 w atrybucie, a następnie użycie
window.atob
lub wwindow.btoa
celu przywrócenia ich do użytecznych danych JSON.źródło