2012-02-22 16 views
8

Ho un'applicazione JavaScript, in cui utilizzo i modelli lato client (underscore.js, Backbone.js).Simboli speciali Json.encode u003c MVC3

I dati per il caricamento della pagina iniziale è legato nella pagina come questa (.cshtml Razor-file):

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

motore Razor esegue in fuga, quindi, se il Model è

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

, in uscita abbiamo:

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

che dopo l'operazione "analizzare":

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

abbiamo dati dell'oggetto con "Title" campo esattamente "<script>alert('XSS');</script>"!

Quando questo va a modello di sottolineatura, avvisa.

In qualche modo i simboli simili a \u003c- sono trattati come i simboli "<" corretti.

Come faccio a sfuggire i simboli "<" a &lt; e &gt; da DB (se in qualche modo ci sono arrivati)?

Forse posso regolare la serializzazione Json.Encode per evitare questi simboli? Forse posso impostare Entity Framework che sto usando, per scappare automaticamente da questi simboli assolutamente tutto il tempo quando ricevo i dati dal DB?

+0

Se si disabilita il '

0

Se si vuole scrivere contenuti non codificata è necessario utilizzare il Html.Raw() helper:

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

Edit:

immagino, forse non sto capendo che cosa il vostro problema. Ad esempio all'interno di un controller di test ho il seguente

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

Nella relativa visualizzazione:

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

Che a sua volta uscite alla console:

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

e apre l'avviso.

+1

No, in realtà DEVO scrivere contenuti codificati. Voglio codificare simboli come "<" dal DB per evitare l'esecuzione di script. Il problema è che il meccanismo di codifica RAZOR non aiuta qui, quando Html.Raw usava, otteniamo questo: {"Titolo": "\ u003cscript \ u003ealert (\ u0027XSS \ u0027) \ u003c/script \ u003e"} – Roman

+0

Là sono ancora i simboli \ u003c trattati in JS come simbolo "<" appropriato. Il motore del rasoio non può codificarli. (Somewhy.) – Roman

+0

@Roman, forse non capisco il tuo problema in quanto l'avviso funziona correttamente dal test che ho appena eseguito? – Jesse

1

È necessario codificare la stringa in formato HTML prima di fornirla a Underscore.

"HTML escaping in Underscore.js templates" spiega come farlo.

+0

Grazie per la risposta, è uno dei modi. Ma ha bisogno di ricordarsi di usarlo ogni volta su un client in ogni modello. Stavo cercando un modo per farlo su un server, magari in qualche modo configurando la serializzazione '(@ Json.Encode (Model))'. – Roman

Problemi correlati