Celem stosowania atrybutu wiązania jest zapobieganie przypisywaniu przez atakującego wartości właściwości podczas publikowania żądania lub kontrolowania właściwości, które chcesz powiązać.
Załóżmy, że masz klasę o nazwie Member
i metodę create, która zapisuje element. Ale nie chcesz, aby użytkownik wysłał wartość dla właściwości MemberType
.
Class Member
{
public int MemberId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string MemberType { get; set; }
}
[HttpPost]
Public ActionResult Create(Member member)
{
Save(member);
}
Załóżmy teraz, jesteś tylko oferując Regularne typ elementu, który jest wartością domyślną. Możesz myśleć, że możesz uniemożliwić użytkownikowi wysłanie wartości właściwości MemberType, nie zezwalając na wprowadzanie danych dla właściwości MemberType
.Ale gdy użytkownik opublikuje obiekt członka, atakujący może przechwycić żądanie i wysłać wartość MemberType w żądaniu, jako MemberId=1&FirstName=Chandra&LastName=Malla&MemberType=Premium
i zapisać członka jako członka Premium. Aby temu zapobiec, możesz ozdobić klasę Member
atrybutem Bind
.
[Bind(Include="MemberId,FirstName,LastName")]
Class Member
{
...
lub
[Bind(Exclude="MemberType")]
Class Member
{
...
Teraz jeśli Member
obiekt zostanie wysłana, typ członkostwa wartość nieruchomości nie zostanie opublikowany.
Jeśli korzystasz z ViewModel, niekoniecznie musisz używać atrybutu bind, ponieważ możesz pominąć właściwości MemberType w swoim ViewModelu.
Class Member
{
public int MemberId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string MemberType { get; set; }
}
Class MemberViewModel
{
public int MemberId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
[HttpPost]
Public ActionResult Create(MemberViewModel memberviewmodel)
{
Save(memberviewmodel);
}
Jeśli nie ładnie zaprojektować swój model i/lub ViewModel i nie używać atrybut powiązania uniknąć delegowania nieruchomości nie chcesz, które mogą mieć szkodliwy wpływ.
Czy te właściwości są również wyłączone z dyskretnego sprawdzania poprawności klienta? – astian
@astian, nigdy tego nie próbowałem, ale najprawdopodobniej tak nie jest. Są one wyłączone z sprawdzania poprawności serwera, ponieważ są wykluczone z powiązania modelu. – ataravati
@ataravati ze względów bezpieczeństwa http://stackoverflow.com/questions/29164776/mvc-security-violation-improperly-controlled-modification-of-dynamically-deter? – Peru