Правильный способ обновления модели в .net core 2.2 без проблем с безопасностью через скрытые поля - PullRequest
2 голосов
/ 29 апреля 2019

При создании элемента лесов (CRUD) Visual Studio создает несколько страниц, у меня возник вопрос по поводу страницы редактирования.Здесь он создает макет по умолчанию для обновления вашей модели, который может быть изменен в соответствии с вашими потребностями.Проблема, которую я вижу, состоит в том, что она создает скрытое поле ввода для вашего идентификатора.Разве это не проблема безопасности, поскольку элемент управления вводом можно редактировать?Если это отредактировано, то когда вы сохраните теорию, это обновит другой элемент (отсюда проблема безопасности)Кроме того, что если у меня есть второе поле, которое не нужно редактировать, например «CreatedBy», я должен просто создать другое скрытое поле?Если это поле также будет отредактировано, я потеряю своего первоначального пользователя CreatedBy.

Кроме того, если я удалю эти скрытые поля ввода для устранения угрозы безопасности, проблема, с которой я сталкиваюсь, заключается в том, что автоматическая проверка не будет выполнена, поскольку она не сохранитмой Id или CreatedBy пользователь на модели.Это также проблема при обновлении, потому что идентификатор также будет потерян.Какой самый лучший и правильный способ справиться с этим?

Ниже приведен пример автоматического кода, созданного Visual Studio при создании элемента леса (CRUD):

...
<form method="post">
    <div asp-validation-summary="ModelOnly" class="text-danger"></div>
    <input type="hidden" asp-for="Test.Id" />
    <div class="form-group">
        <label asp-for="Test.Created" class="control-label"></label>
        <input asp-for="Test.Created" class="form-control" />
        <span asp-validation-for="Test.Created" class="text-danger"></span>
    </div>
    <div class="form-group">
        <label asp-for="Test.CreatedBy" class="control-label"></label>
        <input asp-for="Test.CreatedBy" class="form-control" />
        <span asp-validation-for="Test.CreatedBy" class="text-danger"></span>
    </div>
    <div class="form-group">
        <label asp-for="Test.Blahblah" class="control-label"></label>
        <input asp-for="Test.Blahblah" class="form-control" />
        <span asp-validation-for="Test.Blahblah" class="text-danger"></span>
    </div>
    <div class="form-group">
        <input type="submit" value="Save" class="btn btn-primary" />
    </div>
</form>
...

В любом случае яЯ знаю, что это что-то простое, и я искал в Интернете ответ на этот вопрос, но не смог его найти.Я нашел способы проверки определенных свойств во время проверки, но это по-прежнему не гарантирует, что я не потеряю поля Id и CreatedBy при условии удаления скрытых входных данных.

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

1 Ответ

2 голосов
/ 29 апреля 2019

Есть 2 разные вещи:

  1. Идентификатор для обновления.

    Нет способа предотвратить отправку идентификатора на серверпри обновлении набора данных, потому что HTTP не имеет состояния.Использование обходных путей с такими вещами, как Session или TempData, может предотвратить это, но может создать различные проблемы для пользователей, работающих с несколькими вкладками (например, пользователь загружает объект A, затем в новой вкладке загружает объект B, затем сохраняет объект A на вкладке 1, что вызывает Bдолжен быть перезаписан, поскольку это последний идентификатор, загруженный в сеансе).

    Решением здесь является проверка и авторизация (например, авторизация на основе ресурсов ).


Чрезмерное связывание / «массовое назначение»

Эта проблема возникает, когда клиент отправляет больше информации, чем следует (например, CreatedBy).Решением для этого является либо выделенная ViewModel, содержащая только редактируемые поля, либо использующая такие атрибуты, как [Editable] и [BindNever].Таким образом, привязка модели не будет связывать поля, которые должны быть доступны только для чтения. Здесь - блог, объясняющий эту проблему.

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

...