#c# #asp.net-mvc #database #security #entity-framework
#c# #asp.net-mvc #База данных #Безопасность #entity-framework
Вопрос:
У меня проблема… Я написал веб-сайт, и теперь я должен защитить свою страницу. Итак, проблема в том… когда пользователь редактирует объект, я должен проверить, является ли он владельцем этого объекта. Традиционно (без entity Framework) Я делаю это, включая предложение where в sql-запрос. Например:
update posts set
title = "Great Post"
where
post_id = 5 and
owner_id = " CurrentLogedinUser.Id "
Но я не знаю, как я могу это сделать в entity framework.
Кто-нибудь может мне сказать?
Ответ №1:
В EF вы обычно загружаете элемент из контекста, изменяете его и помещаете обратно. Таким образом, вы можете проверить значение следующим образом:
var post = context.Posts.Single(p => p.PostId == 5);
if(post.OwnerId != CurrentLoggedInUser.Id) throw new Exception("Stop hacking!");
post.title = "Great Post";
context.SaveChanges();
Комментарии:
1. Да … я думаю, этого достаточно. Но производительность в этом решении невелика. Нет ли более быстрого метода?
2. Что вы имеете в виду, производительность в этом решении невелика? Единственное, что вы добавляете, это
if
проверка — и это просто проверка целого числа по сравнению с другим (я предполагаю). Это вообще не замедлит работу.3. Но сначала вы должны получить строку, а затем отправить ее. В стандартном обновлении вы отправляете один раз. И условие проверяется на сервере БД.
4. @robson: Это один из недостатков использования ORM: обрабатывая ваши сохраненные данные как объекты, вы жертвуете некоторой производительностью. Однако я бы сказал, что отказоустойчивое поведение здесь достаточно желательно, чтобы оно стоило жертв. Я бы предпочел, чтобы исключение выдавалось, когда пользователь пытается изменить что-то, что ему не принадлежит, чем просто притворяться, что все чисто, фактически ничего не меняя в базе данных.
Ответ №2:
Если owner_id
это свойство вашей Post
сущности, то разве вы не можете просто проверить это перед отправкой обновления (или даже перед тем, как разрешить им редактировать его)?
Комментарии:
1. Да, я могу проверить это, прежде чем разрешить им редактировать, но если кто-то подготовит форму вручную и отправит ее в serwer, тогда этот метод не сработает.
2. Но проверка перед отправкой обновления (мое первое предложение) все равно предотвратила бы это.