Создает ли свойство ID в модели привязки угрозу перепечатки?

#asp.net-core-mvc

#asp.net-core-mvc

Вопрос:

Я совсем новичок в MVC и не могу разобраться в возможной проблеме переназначения. У меня есть модель «События», которая содержит свойство Id. Когда пользователь, например, хочет отредактировать существующее «Событие», я использую это свойство для извлечения «События», которое мне нужно обновить, из коллекции «Событий».

Я попытался украсить свойство Id атрибутом [BindNever] или [Editable], который приводит к свойству Id, равному 0, поскольку свойство больше не привязывается после публикации. Это, конечно, создает проблемы, когда я хочу использовать это свойство Id для извлечения «События» из коллекции.

Поэтому я оставляю свойство без изменений. Но это кажется неестественным, поскольку это свойство не должно быть доступно для редактирования пользователем. Использование ViewModel не решает мою проблему, поскольку свойство Id все равно потребуется.

Во всех примерах, которые я нахожу в Интернете, свойство Id всегда является частью модели привязки. Создает ли это угрозу для возможного переназначения? Я предполагаю, что нет, поскольку, например, при работе с Entity Framework свойство Id недоступно для редактирования, поскольку оно автоматически создается. Пользователь все равно сможет изменить идентификатор, чтобы обновить другое «Событие», но в случае моего приложения это не создает проблем, поскольку пользователь может редактировать любое «событие», которое он хочет

Модель:

 public class Event
{
    public int Id { get; set; }
    public string Name { get; set; }
}
  

Контроллер:

     [HttpGet]
    public IActionResult EditEvent(int? id)
    {
        if (id == null)
        {
            return NotFound();
        }
        else
        {
            var eventToEdit = _events.GetEvent(id.Value);
            return View(eventToEdit);
        }
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult EditEvent(Event postedEvent)
    {
        if (ModelState.IsValid)
        {
            if (postedEvent == null)
            {
                return NotFound();
            }
            else
            {
                var eventToUpdate = _events.GetEvent(postedEvent.Id);
                eventToUpdate = _events.EditEvent(postedEvent, eventToUpdate);
                return RedirectToAction(nameof(EventDetails), new { id = eventToUpdate.Id });
            }
        }
        else
        {
            return View(postedEvent);
        }
    }
  

Ответ №1:

Создает ли свойство ID в модели привязки угрозу для переназначения?

Да, если вы используете этот идентификатор в качестве подстановки для редактирования, вам нужно написать проверку, которая гарантирует, что пользователю разрешено выполнять редактирование данных.

 public IActionResult EditEvent(Event postedEvent)
{
    //Make sure the current user can edit the posted event
    if(!CanUserEditEvent(postedEvent.Id, User.GetUserId()) return Forbid();

    //User can edit this event so continue normally
    if(ModelState.IsValid)
        ...
}
  

Кроме того, убедитесь, что другие «доступные только для чтения» или неиспользуемые свойства вашей модели, которые отображаются в представлении и действии, затем не используются в качестве поиска или сохраняются. Модель представления может помочь в этом, позволяя вам определять подмножество свойств вашей модели домена.

Комментарии:

1. Также к приведенному выше ответу можно добавить одну вещь, о которой вы много думаете, имея в виду модели просмотра и т.д. Контроллер может получать и будет получать любые данные. единственный способ убедиться, что ваш пользователь имеет право редактировать событие, — это воспользоваться приведенным выше ответом @Show. Злоумышленник может попытаться ввести в ваш контроллер случайный идентификатор, чтобы испортить работу вашего приложения. Вот тут-то и пригодятся права доступа. Также я бы рекомендовал хранить информацию о правах доступа во время сеанса. Как только пользователь регистрируется, вы добавляете к сеансам его права доступа и проверяете у контроллера. Сеансовые расширения — это спасение жизни