Как предотвратить изменение идентификатора Expliot в Entity Framework - PullRequest
0 голосов
/ 20 мая 2018

При сохранении сущности в EntityFrameworkCore идентификатор Id, разумеется, публикуется как часть оператора обновления от клиента.

При чтении блога они упоминали, что хакер может просто изменитьИдентификатор объекта и тем самым вызывает обновление для другого объекта, возможно, для другого пользователя.

Есть ли способ заблокировать это?

Единственный способ, которым я могу придумать, - это получить существующую сущность на сервере, а затем подтвердить, что она действительно принадлежит текущему пользователю, и только затем обновить.

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

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

Сторона безопасностихорошая практика, однако для дальнейшей защиты вам лучше использовать первичные ключи GUID вместо 1, 2, 3, а также поле временной метки для проверки параллелизма.

Например, допустим, у нас естьМодель под названием Person, мы хотим убедиться, что когда она обновляется, она не только устарела (то есть кто-то побил нас ею), но мы также хотим убедиться, что это правильная запись, IE Concurrency: Предполагается, что здесь SQL-сервер.

public class Person{
    [Timestamp]
    public byte[] Timestamp { get; set; }
}

В нашем Создании модели Fluent API мы затем настроили бы метку времени в качестве идентификатора версии строки.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Person>()
        .Property(p => p.Timestamp)
        .IsRowVersion();
}

Вместе с ключом GUID, они не только получили правильный GUID,но также нужно правильно настроить Rowversion.

Теперь вы не хотите пытаться разрешить параллелизм, как советовали повсюду, потому что, по сути, вам удалось найти другого гида и получить удар, теперь вы не хотите начинать копировать данныеиз одного безопасного источника в другой.Вместо этого вы можете либо перенаправить на исходную версию get (это повторно проверит разрешения и перезагрузить (с невозможностью обновить сообщение), либо вы можете просто сказать, что это не удалось. В любом случае, вы должны избегать говорить (хорошо, это было хорошо).угадайте другой GUID, но временная метка неверна). IE при входе в систему вы не сказали бы, что пароль неправильный, вы просто сказали, что вход не удался.

Для конечного пользователя это может быть проблемой в тылу, посколькувы не облегчаете им задачу, вы не обрабатываете параллелизм для них, не сопоставляете и не сортируете все данные для них, но вам нужно легче запоминать для пользователя = легче для плохого пользователя. Так же, как это уже не легкопрыгнуть на самолет, это не должно вас злить, это означает, что вы должны быть в безопасности, и вот правила.

Стоит думать о данных как о своей собственной сущности, безопасности системы, не должныбыть единственным способом защиты данных, пароли легко взломать, хешированные пароли легко взломать.взломать, а затем получить прямой доступ к системам.Это всего лишь одна часть. Вы должны защищать данные, даже от любой роли Бога или администратора, которую вы, возможно, выполняли.

0 голосов
/ 20 мая 2018

Это - то, где приходит структура авторизации. Код на стороне сервера берет идентификацию вызывающего и проверяет, разрешено ли вызывающему выполнить это действие.

Если ваши бизнес-правила говорят, что пользователям разрешено толькочтобы обновить свои собственные сущности, ваш authZ проверяет, совпадает ли идентификатор, связанный с прошедшим проверку пользователем, с идентификатором в операторе обновления.

Если у пользователя есть права администратора, ему / ей может быть разрешено обновить любую сущность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...