2012-03-20 26 views
7

Attualmente stiamo trattando alcuni problemi XSS su uno dei nostri progetti ASP.NET MVC. Ho trovato due problemi: il primo ha a che fare con il modello di convalida della richiesta. L'utente malintenzionato potrebbe ora utilizzare questo buco di sicurezza per eliminare alcuni contenuti non validi nel nostro database.Lo standard Html.DisplayTextFor() non codifica HTML?

Il secondo problema è come visualizziamo questo contenuto e usiamo il metodo Html.DisplayTextFor e sembra essere "rotto".

Basta creare un nuovo MVC 3 WebApp, mettere questo nel HomeController:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     ViewBag.Message = "<SCRIPT/XSS SRC=\"htpp://ha.ckers.org/css.js\">"; 

     User foo = new User(); 
     foo.Name = "<SCRIPT/XSS SRC=\"htpp://ha.ckers.org/css.js\">"; 

     return View(bla); 
    } 

    public ActionResult About() 
    { 
     return View(); 
    } 
} 

public class User 
{ 
    public string Name { get; set; } 
} 

The View:

@Html.TextBoxFor(m => m.Name) <br/> ||| <-- will be encoded 

@Html.Encode(ViewBag.Message)<br/> ||| <-- will be double encoded 

@Model.Name <br/> ||| <-- will be encoded 

@Html.DisplayTextFor(m => m.Name) <-- no encoding 
<br/> ||| 

uscita del DisplayTextFor sarà l'intera stringa <script xss="" src="htpp://ha.ckers.org/css.js">

domanda is: Bug, feature o sto usando male?

risposta

2

Html.DisplayTextFor è davvero per l'interazione con l'attributo [DisplayFormat] (see MSDN).

Quindi, se lo si utilizza con valori non sicuri, è necessario essere consapevoli di questo e utilizzare [DisplayFormat(HtmlEncode = true)] sulla proprietà.

Modifica: Sembra che la proprietà HtmlEncode non sia effettivamente applicata da DataAnnotationsModelMetadataProvider (e DisplayTextFor).

+0

Quindi, se voglio solo generare stringhe semplici, che possono contenere valori errati (e non voglio decorare tutte le mie proprietà con l'attributo DisplayFormat), dovrei usare solo @ Model.Name invece di DisplayTextFor? È possibile sovrascrivere il comportamento predefinito per i tipi di base (string/int/double/...)? –

+0

corretto, '@ Model.Name' è l'ideale per i casi semplici. Per i tipi di base, puoi comunque chiamare 'ToString()' esplicitamente e specificare un formato o un fornitore di formato, ad es. '@ Model.Number.ToString (" N ")' – bhamlin

+0

Qualche idea sul perché il valore con DisplayTextFor non è ancora codificato quando utilizzo l'attributo [DisplayFormat (HtmlEncode = true)]? L'ho appena messo nella proprietà "Name" nel mio modello. Ho bisogno di qualcos'altro? –