Atrybut [Bind (Exclude = „”)]] nie zapobiega nadmiernemu publikowaniu

Jaki jest najlepszy sposób, aby zapobiec nadpisywaniu MVC 4?

Według źródeł MS atrybut [Bind] ma być najłatwiejszym sposobem zapobiegania nadmiernemu księgowaniu, uniemożliwiając przychodzącym wartościom formularzy przejście do bazy danych. W najnowszej wersji MVC i EF wydaje się, że nie działa to zgodnie z oczekiwaniami / reklamami, chyba że brakuje mi czegoś ważnego.

ZWrox Professional ASP.NET MVC 4 (Rozdział 7 Jona Gallowaya), następująca klasa powinna zapobiegać nadpisywaniu:

[Bind(Exclude="IsAdmin")]
public class User
{
    public int ID { get; set; }
    public string FirstName { get; set; }
    public bool IsAdmin { get; set; }
}

Jednak wszystkie atrybuty [Bind] uniemożliwiają powiązanie wartości przesłania formularza z modelem. Model ma wtedy wartość pustą / domyślną, która jest zapisywana z powrotem do bazy danych. W tym przypadku zapewniłoby to, że IsAdmin = false KAŻDY CZAS wywołujesz .SaveChanges () używając tego modelu. Wszelkie „prawdziwe” wartości są nadpisywane. To ogromna awaria bezpieczeństwa.

Alternatywna składnia - umieszczenie [Bind] w parametrze akcji Edytuj kontroler - robi dokładnie to samo:

public ActionResult Edit([Bind(Exclude = "IsAdmin")] User user)

Wszystkie „prawdziwe” wartości są nadpisywane, gdy nazywa się .SaveChanges (), co jest sprzeczne z postem na blogu K. Scotta Allena na ten temat:http://odetocode.com/blogs/scott/archive/2012/03/11/complete-guide-to-mass-assignment-in-asp-net-mvc.aspx

Jedyną alternatywą wydaje się być mnóstwo dedykowanych ViewModeli połączonych z Automapper. Choć bezpieczny, wydaje się to MASYWNYM bólem głowy, zwłaszcza, że:

Możesz mieć różne wymagania dla akcji Create, Edit, Index i Detail, wymagających różnych ViewModelsMoże być konieczne udostępnienie niektórych pól tylko do odczytu (takich jak CreatedBy w akcji Edit), które nie mogą mieć atrybutu [ReadOnly] we właściwości, ponieważ są one aktualizowane przez akcję Create

Wiem, że ktoś odpowie, mówiąc, że powinieneśnigdy powiązać modele danych z widokami, ale jest to domyślne zachowanie szablonu i sposób, w jaki są one wyświetlane w prawie całej dokumentacji. A poza tym MVC + EF miało stworzyć życiełatwiej, nietrudnieji ocean klas ModelView połączonych z AutoMapper nie jest tym, co uważam za łatwiejsze.

Czy ktoś wie, jak sprawić, by funkcja [Bind] działała zgodnie z reklamą?

questionAnswers(2)

yourAnswerToTheQuestion