Сижу читаю статью с хабра, постепенно перенося код из презентации в тестовое приложение.
Добрался до следующего фрагмента, впал в ступор:
Стало лучше? Стало! А еще мы теперь этот метод можем повторно использовать в разных контроллерах. Результат налицо. Давайте посмотрим на реализацию этого метода.
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 и нам зачем-то приходит в голову тут же проверить, а вдруг они перестали быть равны.
Зачем??? Не понимаю, может кто понимает и объяснит?
Автор статьи ответил в личной переписке:
В слайдах ошибка. Должно быть var user = _context.CurrentUser. Имеется в виду проверка на то, что авторизованный пользователь пытается изменить данные другого пользователя
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Есть 2 объекта которые должны друг от друга зависеть, но один из них может отсутствовать при заполнении пишет:
Всем, доброго времени сутокНазрел интересный вопросик относительно верстки блоков-карточек (по крайней мере я их так называю)
Начал изучать html и решил заодно создать сайт на котором я буду конспектировать свои знанияХочу вставлять теги и т