2012-03-20 11 views
7

Obecnie zajmujemy się niektórymi problemami XSS w jednym z naszych projektów ASP.NET MVC. Znalazłem dwie kwestie - pierwsza dotyczy naszego wzoru sprawdzania poprawności żądania. Atakujący może teraz użyć tej luki w zabezpieczeniach, aby usunąć złe treści z naszej bazy danych.Czy standardowe Html.DisplayTextFor() bez kodowania HTML?

Drugim zagadnieniem jest to, jak wyświetlamy te treści i używamy metody Html.DisplayTextFor, która wydaje się być "zepsuta".

Wystarczy utworzyć nowy MVC 3 webapp, umieścić to w 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/> ||| 

Wyjście DisplayTextFor będzie cały ciąg <script xss="" src="htpp://ha.ckers.org/css.js">

Pytanie to: Bug, funkcja lub czy używam go źle?

Odpowiedz

2

Html.DisplayTextFor jest tak naprawdę do interakcji z atrybutem [DisplayFormat] (see MSDN).

Więc jeśli używasz go z niebezpiecznymi wartościami, musisz być tego świadomy i użyć [DisplayFormat(HtmlEncode = true)] w swojej nieruchomości.

Edytuj: Wygląda na to, że właściwość HtmlEncode nie jest faktycznie wymuszana przez DataAnnotationsModelMetadataProvider (i DisplayTextFor).

+0

Więc jeśli chcę tylko wyprowadzać proste ciągi, które mogą zawierać złe wartości (i nie chcę dekorować wszystkich moich właściwości atrybutem DisplayFormat), powinienem użyć tylko @ Model.Name zamiast DisplayTextFor? Czy możliwe jest przesłonięcie domyślnego zachowania dla typów bazowych (string/int/double/...)? –

+0

Prawidłowo, '@ Model.Name' jest najlepsze w prostych przypadkach. W przypadku typów bazowych można nadal wywoływać jawnie 'ToString()' i określać format lub formatprovider, np. '@ Model.Number.ToString (" N ")' – bhamlin

+0

Każdy pomysł, dlaczego wartość z DisplayTextFor nadal nie jest zakodowana, gdy używam atrybutu [DisplayFormat (HtmlEncode = true)]]? Po prostu umieściłem go we właściwości "Nazwa" w moim modelu. Czy potrzebuję czegoś jeszcze? –

Powiązane problemy