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?
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/...)? –
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
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? –