Estou pensando em incorporar JSON arbitrário no DOM assim:
<script type="application/json" id="stuff">
{
"unicorns": "awesome",
"abc": [1, 2, 3]
}
</script>
Isso é semelhante à maneira como alguém pode armazenar um modelo HTML arbitrário no DOM para uso posterior com um mecanismo de modelo JavaScript. Nesse caso, poderíamos posteriormente recuperar o JSON e analisá-lo com:
var stuff = JSON.parse(document.getElementById('stuff').innerHTML);
Isso funciona , mas é a melhor maneira? Isso viola alguma prática recomendada ou padrão?
Observação: não estou procurando alternativas para armazenar JSON no DOM, já decidi que essa é a melhor solução para o problema específico que estou tendo. Só estou procurando a melhor maneira de fazer isso.
javascript
json
dom
embedding
decoupling
Ben Lee
fonte
fonte
var
em javascript?</script><script>alert()</script><script>
dentro de seu objeto JSON, terá surpresas. Isso não é seguro, a menos que você primeiro higienize os dados.Respostas:
Acho que seu método original é o melhor. A especificação HTML5 ainda aborda esse uso:
Leia aqui: http://dev.w3.org/html5/spec/Overview.html#the-script-element
Você fez exatamente isso. O que não é amar? Nenhuma codificação de caracteres necessária com dados de atributo. Você pode formatá-lo se quiser. É expressivo e o uso pretendido é claro. Não parece um hack (por exemplo, como usar CSS para ocultar seu elemento "transportador"). É perfeitamente válido.
fonte
script
tags.Como orientação geral, eu tentaria usar atributos de dados HTML5 . Não há nada que o impeça de inserir um JSON válido. por exemplo:
Se você estiver usando jQuery, recuperá-lo é tão fácil quanto:
fonte
JSON.parse
não funcionará (pelo menos o JSON.parse nativo do Google Chrome não funcionará). A especificação JSON requer aspas duplas. Mas isso é fácil de corrigir usando entidades como...<unicorns>:...
."I am valid JSON"
usando aspas duplas para a tag, ou aspas simples com aspas simples na string, por exemplodata-unicorns='"My JSON's string"'
, as aspas simples não escapam da codificação como JSON.Este método de incorporação de json em uma tag de script tem um possível problema de segurança. Assumindo que os dados json originaram-se da entrada do usuário, é possível criar um membro de dados que, com efeito, sairá da tag do script e permitirá a injeção direta no dom. Veja aqui:
http://jsfiddle.net/YmhZv/1/
Aqui está a injeção
Simplesmente não há como escapar / codificar.
fonte
Consulte a regra nº 3.1 na folha de dicas de prevenção de XSS do OWASP.
Digamos que você queira incluir este JSON em HTML:
Crie um oculto
<div>
em HTML. Em seguida, escape de seu JSON codificando entidades não seguras (por exemplo, &, <,>, ", 'e, /) e coloque-o dentro do elemento.Agora você pode acessá-lo lendo o
textContent
do elemento usando JavaScript e analisando-o:fonte
{name: 'Dwayne "The Rock" Johnson'}
. Mas provavelmente ainda é melhor usar essa abordagem, já que sua biblioteca de framework / modelos provavelmente já inclui uma maneira segura de fazer a codificação HTML. Uma alternativa seria usar base64, que é HTML e seguro para ser colocado dentro de uma string JS. É fácil codificar / decodificar em JS usando btoa () / atob () e provavelmente é fácil para você fazer no lado do servidor.<data>
elemento semanticamente correto e incluir os dados JSON novalue
atributo. Em seguida, você só precisa escapar das aspas com"
se usar aspas duplas para incluir os dados ou'
se usar aspas simples (o que provavelmente é melhor).Eu sugiro colocar JSON em um script embutido com um retorno de chamada de função (tipo de JSONP ):
Se o script em execução for carregado após o documento, você poderá armazená-lo em algum lugar, possivelmente com um argumento identificador adicional:
someCallback("stuff", { ... });
fonte
Minha recomendação seria manter os dados JSON em
.json
arquivos externos e, em seguida, recuperar esses arquivos via Ajax. Você não coloca código CSS e JavaScript na página da web (inline), então por que faria isso com JSON?fonte
HTML5 inclui um
<data>
elemento para manter os dados legíveis por máquina. Como uma alternativa - talvez mais segura - para<script type="application/json">
você pode incluir seus dados JSON dentro dovalue
atributo desse elemento.Nesse caso, você precisa substituir todas as aspas simples por
'
ou por,"
se optar por colocar o valor entre aspas duplas. Caso contrário, o risco de ataques XSS , como outras respostas sugeriram.fonte