2012-02-22 17 views
8

Tengo la aplicación JavaScript, donde uso plantillas del lado del cliente (underscore.js, Backbone.js).Json.encode símbolos especiales u003c MVC3

Los datos de carga de la página inicial es atado a la página como esta (.cshtml Razor-archivo):

<div id="model">@Json.Encode(Model)</div> 

motor de la maquinilla de afeitar realiza escapaba, por lo que, si el Model es

new { Title = "<script>alert('XSS');</script>" } 

, en la producción tenemos:

<div id="model">{&quot;Title&quot;:&quot;\u003cscript\u003ealert(\u0027XSS\u0027)\u003c/script\u003e&quot;}</div> 

que tras la operación "analizar":

var data = JSON.parse($("#model").html()); 

tenemos datos de objeto con "Title" campo exactamente "<script>alert('XSS');</script>"!

Cuando esto se aplica a la plantilla de subrayado, alerta.

De alguna manera \u003c- símbolos similares se tratan como símbolos "<" apropiados.

¿Cómo puedo escapar de los símbolos "<" a &lt; y &gt; de DB (si de alguna manera llegaron allí)?

Quizás puedo sintonizar la serialización Json.Encode para escapar de estos símbolos? Tal vez puedo configurar Entity Framework que estoy usando, para escapar automáticamente estos símbolos absolutamente todo el tiempo al obtener datos de DB?

+0

Si desactiva el '

0

Si desea escribir el contenido sin codificar, tendrá que utilizar el Html.Raw() ayudante:

@Html.Raw(Json.Encode(Model)) 

Editar:

supongo, tal vez no estoy entendiendo cuál es tu problema. Por ejemplo dentro de un controlador de prueba Tengo el siguiente

ViewBag.Test = new { Title = "<script>alert('XSS');</script>" }; 

En la vista relacionada:

<script type="text/javascript"> 
     var test = @Html.Raw(Json.Encode(ViewBag.Test)); 
     console.log(test.Title); 
     document.write(test.Title); 
    </script> 

cual a su vez salidas a la consola:

<script>alert('XSS');</script> 

y abre la alerta.

+1

No, en realidad YO QUIERO escribir contenido codificado. Quiero codificar símbolos como "<" de DB para evitar la ejecución de scripts. El problema es que el mecanismo de codificación de RAZOR no ayuda aquí, cuando se utiliza Html.Raw, obtenemos esto: {"Título": "\ u003cscript \ u003ealert (\ u0027XSS \ u0027) \ u003c/script \ u003e"} – Roman

+0

Hay son todavía símbolos \ u003c que se tratan en JS como el símbolo apropiado "<". El motor Razor no puede codificarlos. (Somewhy.) – Roman

+0

@Roman, tal vez no entiendo su problema ya que la alerta funciona correctamente de la prueba que acabo de ejecutar. – Jesse

1

Debe codificar su cadena como HTML antes de proporcionarla a Underscore.

"HTML escaping in Underscore.js templates" explica cómo hacerlo.

+0

Gracias por su respuesta, es una de las formas. Pero debe recordar usar esto cada vez en un cliente en cada plantilla. Estaba buscando alguna forma de hacer esto en un servidor, tal vez configurando de algún modo la serialización '(@ Json.Encode (Model))'. – Roman