Estoy pensando en incrustar JSON arbitrario en el DOM de esta manera:
<script type="application/json" id="stuff">
{
"unicorns": "awesome",
"abc": [1, 2, 3]
}
</script>
Esto es similar a la forma en que se puede almacenar una plantilla HTML arbitraria en el DOM para su uso posterior con un motor de plantillas JavaScript. En este caso, más tarde podríamos recuperar el JSON y analizarlo con:
var stuff = JSON.parse(document.getElementById('stuff').innerHTML);
Esto funciona , pero ¿es la mejor manera? ¿Esto viola alguna de las mejores prácticas o estándar?
Nota: No estoy buscando alternativas para almacenar JSON en el DOM, ya he decidido que es la mejor solución para el problema particular que tengo. Solo estoy buscando la mejor manera de hacerlo.
javascript
json
dom
embedding
decoupling
Ben Lee
fuente
fuente
var
en javascript?</script><script>alert()</script><script>
dentro de su objeto JSON, obtendrá sorpresas. Esto no es seguro a menos que primero desinfecte los datos.Respuestas:
Creo que tu método original es el mejor. La especificación HTML5 incluso aborda este uso:
Lea aquí: http://dev.w3.org/html5/spec/Overview.html#the-script-element
Has hecho exactamente eso. que es no amar? Sin codificación de caracteres según sea necesario con datos de atributos. Puede formatearlo si lo desea. Es expresivo y el uso previsto es claro. No se siente como un truco (por ejemplo, como usar CSS para ocultar su elemento "portador"). Es perfectamente válido.
fuente
script
etiquetas.Como dirección general, intentaría usar atributos de datos HTML5 en su lugar. No hay nada que le impida poner un JSON válido. p.ej:
Si está utilizando jQuery, recuperarlo es tan fácil como:
fuente
JSON.parse
no funcionará (al menos el JSON.parse nativo de Google Chrome no lo hará). La especificación JSON requiere comillas dobles. Pero eso es bastante fácil de arreglar usando entidades como...<unicorns>:...
."I am valid JSON"
usando comillas dobles para la etiqueta, o comillas simples con comillas simples en la cadena, por ejemplo,data-unicorns='"My JSON's string"'
ya que las comillas simples no se escapan con la codificación como JSON.Este método de incrustar json en una etiqueta de script tiene un problema de seguridad potencial. Suponiendo que los datos json se originaron a partir de la entrada del usuario, es posible crear un miembro de datos que, de hecho, salga de la etiqueta del script y permita la inyección directa en el dom. Mira aquí:
http://jsfiddle.net/YmhZv/1/
Aquí está la inyección
Simplemente no hay forma de escapar / codificar.
fuente
Consulte la Regla n. ° 3.1 en la hoja de trucos de prevención XSS de OWASP.
Supongamos que desea incluir este JSON en HTML:
Crea un oculto
<div>
en HTML. A continuación, escapa de tu JSON codificando entidades no seguras (por ejemplo, &, <,>, ", 'y, /) y colócalo dentro del elemento.Ahora puede acceder a él leyendo el
textContent
del elemento usando JavaScript y analizándolo:fuente
{name: 'Dwayne "The Rock" Johnson'}
. Pero probablemente sea mejor usar este enfoque, ya que su marco / biblioteca de plantillas probablemente ya incluye una forma segura de codificar HTML. Una alternativa sería usar base64, que es HTML seguro y seguro para colocar dentro de una cadena JS. Es fácil de codificar / decodificar en JS usando btoa () / atob () y probablemente sea fácil para usted hacerlo en el lado del servidor.<data>
elemento semánticamente correcto e incluir los datos JSON en elvalue
atributo. Entonces solo necesita escapar de las comillas"
si usa comillas dobles para encerrar los datos, o'
si usa comillas simples (que probablemente sea mejor).Sugeriría poner JSON en un script en línea con una función de devolución de llamada (tipo de JSONP ):
Si el script de ejecución se carga después del documento, puede almacenarlo en algún lugar, posiblemente con un argumento identificador adicional:
someCallback("stuff", { ... });
fuente
Mi recomendación sería mantener los datos JSON en
.json
archivos externos y luego recuperar esos archivos a través de Ajax. No colocas código CSS y JavaScript en la página web (en línea), entonces, ¿por qué lo harías con JSON?fuente
HTML5 incluye un
<data>
elemento para mantener los datos legibles por máquina. Como alternativa, quizás más segura,<script type="application/json">
podría incluir sus datos JSON dentro delvalue
atributo de ese elemento.En este caso, debe reemplazar todas las comillas simples con
'
o con"
si opta por incluir el valor entre comillas dobles. De lo contrario, corre el riesgo de ataques XSS como han sugerido otras respuestas.fuente