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">{"Title":"\u003cscript\u003ealert(\u0027XSS\u0027)\u003c/script\u003e"}</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 <
y >
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?
Si desactiva el '
Si desea escribir el contenido sin codificar, tendrá que utilizar el Html.Raw() ayudante:
Editar:
supongo, tal vez no estoy entendiendo cuál es tu problema. Por ejemplo dentro de un controlador de prueba Tengo el siguiente
En la vista relacionada:
cual a su vez salidas a la consola:
y abre la alerta.
Fuente
2012-02-23 03:09:22 Jesse
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
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
@Roman, tal vez no entiendo su problema ya que la alerta funciona correctamente de la prueba que acabo de ejecutar. – Jesse
Debe codificar su cadena como HTML antes de proporcionarla a Underscore.
"HTML escaping in Underscore.js templates" explica cómo hacerlo.
Fuente
2012-02-23 06:10:55
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