ASP.NET MVC UpdateModel, уязвимый для взламывания?

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

5
задан Dinah 1 October 2009 в 19:53
поделиться

5 ответов

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

Например, из NerdDinner:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create( [Bind(Include="Title, Address")] Dinner dinner)
{

}

или если вы вызываете UpdateModel, вы можете создать строковый массив разрешенных свойств, и выполните

UpdateModel(myObject, allowedProperties);

Вы можете заблокировать сами классы, чтобы можно было обновлять только определенные свойства.

[Bind(Include="MyProp1,MyProp2,MyProp3")]
public partial class MyEntity { }
9
ответ дан 18 December 2019 в 07:10
поделиться

Ваши опасения верны. Это называется массовым присвоением. Вы можете защитить свой код, пометив свой класс с помощью BindAttribute и установив Exclude / Include properties.

7
ответ дан 18 December 2019 в 07:10
поделиться

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

. Самый простой - использовать перегрузку свойств exclude / include UpdateModel, как упоминалось ранее. Обратной стороной этого является то, что метод принимает только массив строк, что иногда может означать, что ваш код выходит из синхронизации, если вы выполняете какое-либо переименование.

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

public ActionResult(int id, EditForm form) {
    MyEvent event = _eventRepository.GetMyEvent(id);
    event.Name = form.Name; //etc;
    if (User.IsInRole("Organiser")) {
        event.Date = form.Date;
    }
    return ...
}

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

4
ответ дан 18 December 2019 в 07:10
поделиться

Есть перегрузки UpdateModel , которые принимают массив строк с именами свойства для обновления. Эти перегрузки будут обновлять только названные свойства.

Могут быть другие более простые / декларативные способы сделать это, я не эксперт по привязке данных MVC.

1
ответ дан 18 December 2019 в 07:10
поделиться

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

1
ответ дан 18 December 2019 в 07:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: