Мне нужно поместить объект JSON в атрибут элемента HTML.
HTML не требует проверки.Ответил Квентин: Сохраните JSON в
data-*
атрибуте , который является допустимым HTML5.Объект JSON может быть любого размера - т.е. огромным.
Ответ Майку Мори: Максимальное значение атрибута HTML потенциально составляет 65536 символов .
Что, если JSON содержит специальные символы? например
{foo: '<"bar/>'}
Отвечено Квентином: закодируйте строку JSON, прежде чем помещать ее в атрибут, в соответствии с обычными соглашениями. Для PHP используйте функцию .
htmlentities()
РЕДАКТИРОВАТЬ - Пример решения с использованием PHP и jQuery
Запись JSON в атрибут 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>
Получение JSON с помощью 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
источник
источник
data-json
вы должны использовать$(this).data('json')
, jQuery предоставит вам эту часть.Ответы:
Почему нет? Валидация - это действительно простой QA, который выявляет множество ошибок. Используйте
data-*
атрибут HTML 5 .Я не видел документации по ограничениям браузера на размеры атрибутов.
Если вы все же столкнетесь с ними, сохраните данные в файле
<script>
. Определите объект и сопоставьте элементid
s с именами свойств в этом объекте.Просто следуйте обычным правилам включения ненадежных данных в значения атрибутов. Используйте
&
и"
(если вы заключаете значение атрибута в двойные кавычки) или'
(если вы заключаете значение атрибута в одинарные кавычки).Однако обратите внимание, что это не JSON (который требует, чтобы имена свойств были строками, а строки были разделены только двойными кавычками).
источник
htmlentities($json)
прежде чем помещать это в атрибут HTML? А как потом расшифровать это, если я хочу прочитать это в jQuery? И как потом записать его обратно с помощью jQuery так же, как это было в PHP?В зависимости от того, куда вы его положите,
<div>
как вы просили, вы должны убедиться , что JSON не содержит HTML - события , которые могли бы начать тег, HTML комментарий, встроенный доктайп и т.д. Вам нужно бежать по меньшей мере ,<
, и&
таким образом , что первоначальный характер не появляются в экранированной последовательности.<script>
элементах необходимо убедиться, что JSON не содержит закрывающего тега</script>
или экранирующей границы текста:<!--
или-->
."
или'
).Для первых двух случаев (и для старых парсеров JSON) вы должны кодировать U + 2028 и U + 2029, поскольку это символы новой строки в JavaScript, даже если они разрешены в строках, не закодированных в JSON.
Для корректности вам нужно экранировать
\
символы кавычек JSON, и никогда не бывает плохой идеей всегда кодировать NUL.Если HTML-код может обслуживаться без кодировки содержимого, вы должны кодировать,
+
чтобы предотвратить атаки UTF-7 .В любом случае будет работать следующая экранирующая таблица:
\u0000
\n
или\u000a
\r
или\u000d
"
->\u0022
&
->\u0026
'
->\u0027
+
->\u002b
/
->\/
или\u002f
<
->\u003c
>
->\u003e
\
->\\
или\u005c
\u2028
\u2029
Таким образом, строковое значение JSON для текста
Hello, <World>!
с новой строкой в конце будет"Hello, \u003cWorld\u003e!\r\n"
.источник
return (input.replace(/([\s"'
& + \ / \\ <> \ u2028 \ u2029 \ u0000]) / g, (совпадение, p1) => {return\\u${p1.codePointAt(0).toString(16).padStart(4, 0)}
; })); `Другой способ сделать это - поместить данные json внутри
<script>
тега, но не сtype="text/javascript"
, а сtype="text/bootstrap"
илиtype="text/json"
типом, чтобы избежать выполнения javascript.Затем в каком-то месте вашей программы вы можете запросить это следующим образом:
На стороне сервера вы можете сделать что-то вроде этого (этот пример с php и twig ):
источник
<script type="application/json" id="MyData"></script>
отлично работает. Затем, используя ActiveWAFL / DblEj, я могу посмотреть его с:document.GetData("#MyData")
.<script type="application/json" id="MyData"> "abc</script><script>alert()</script>" </script>
Другой вариант - base64 закодировать строку JSON, и если вам нужно использовать ее в своем javascript, декодируйте ее с помощью
atob()
функции.источник
atob
. Я никогда не знал об этом!Вы можете использовать knockoutjs,
knockout.js
Вывод
Имя: Джейсон Фамилия: Монтеррозо
Проверьте это: http://learn.knockoutjs.com/
источник
Здесь ничего особенного. Из PHP пропустите строку JSON,
htmlspecialchars
чтобы убедиться, что никакие специальные символы не могут быть интерпретированы как HTML. Из Javascript экранировать не нужно; просто установите атрибут, и все готово.источник
Для простых объектов JSON подойдет приведенный ниже код.
Encode:
Расшифровать:
источник
Что вы можете сделать, так это использовать cdata вокруг ваших элементов, например
где mydata - это необработанная строка json. Надеюсь, это поможет вам и другим.
источник
">
в своих данных?Еще одна мысль, которую можно было бы использовать, - это сохранить данные JSON в виде строки base64 в атрибуте, а затем использовать
window.atob
илиwindow.btoa
восстановить их до пригодных для использования данных JSON.источник