От чего защищаемся когда id не id

Сижу читаю статью с хабра, постепенно перенося код из презентации в тестовое приложение.

Добрался до следующего фрагмента, впал в ступор:

Стало лучше? Стало! А еще мы теперь этот метод можем повторно использовать в разных контроллерах. Результат налицо. Давайте посмотрим на реализацию этого метода.

public void UpdateEmail(int id, string email)
{
    try
    {
        using (MiniProfiler.Current.Step("Update email"))
        {
            email = email.ToLower();
            var user = _userRepository.ById(id);
            if (user.Id != id)
            {
                var message = $"Попыткаизменитьчужиеданные {user.Id}/{id}";
                _logger.LogWarning(message);
                throw new SecurityException(message);
            }

            user.Email = email;
            _dbContext.SaveChanges();
        }
    }
    catch (DbUpdateException e)
    {
        _logger.LogCritical(e.Message);
        throw;
    }
}

Я что-то не особо понимаю, в чём смысл проверки user.Id != id, в каких случаях вообще возможна какая-то атака, что нужно отдельно предусмотреть данную проверку с выбросом SecurityException

На входе у нас int, не строка, значит навтыкать каких-то спецсимволов для эксплуатации sql injection не выйдет. В репозитории наверняка стоит тривиальное (см. код из предыдущих слайдов):

        var user = _dbContext.Set<User>()
                             .FirstOrDefault(x => x.Id == id);

То есть мы ищем в базе x.Id == id и нам зачем-то приходит в голову тут же проверить, а вдруг они перестали быть равны.

Зачем??? Не понимаю, может кто понимает и объяснит?


Ответы (1 шт):

Автор решения: A K

Автор статьи ответил в личной переписке:

В слайдах ошибка. Должно быть var user = _context.CurrentUser. Имеется в виду проверка на то, что авторизованный пользователь пытается изменить данные другого пользователя

→ Ссылка