Безопасность уровня управления в ASP.Net для элементов управления на стороне сервера и на стороне клиента

У меня есть программное приложение в ASP.Net, у меня есть разные кнопки и метки ссылок, каждая кнопка имеет классы, например, кнопки добавления имеют классы btnAdd, а некоторые метки используют аналогичные классы. Что было бы лучшим подходом, если мне нужна безопасность на уровне управления, например, пользователю с идентификатором = 2 не должно быть разрешено нажимать кнопку «Добавить новый» на какой-либо странице ABC.

Мое решение: у меня есть несколько решений, например, сохранить имена классов в таблице и связать эту таблицу с таблицей страниц и перенести данные в скрытое текстовое поле, а затем при загрузке страницы мы проверьте, разрешен ли этот элемент управления или нет. Например, btnAdd может быть видимым, а btnSearch — нет.

Пожалуйста, найдите изображение, прикрепленное для дальнейшего разъяснения. введите здесь описание изображения

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


person Muhammad Atif Agha    schedule 04.01.2018    source источник


Ответы (1)


Используйте Razor для создания кнопок

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

Допустим, у вас есть модель (назовем ее Users) с набором разрешений, к которому вы можете получить доступ через Users.UserPermissions. Ваше свойство UserPermissions может иметь логическое значение CanAdd и CanSearch. Вы должны заполнить эту модель данными из вашей базы данных о рассматриваемом пользователе, а затем отобразить страницу следующим образом:

<div class="container">
    @{
        if (Model.UserPermissions.CanAdd)
        {
            <button class="add">Add</button>
        }

        if (Model.UserPermissions.CanSearch)
        {
            <button class="search">Search</button>
        }
    }
</div>

Затем проверьте свои разрешения на стороне сервера

Это означает, что кнопка будет добавлена ​​в интерфейс только в том случае, если у пользователя есть разрешение на выполнение этого действия.

[HttpPost]
public ActionResult Index(UserViewModel model)
{
    var user = User.GetByEmail(userEmail);

    if (user.CanAdd)
    {
        myClass.Add(model.ThingsToAdd);
    }

    if (user.CanSearch)
    {
        myClass.Search(model.ThingsToSearchFor);
    }

    return View()
}

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

Это эквивалентно попытке снять деньги в банке — кассир должен сначала убедиться, что у вас есть деньги в банке, прежде чем они вручат вам наличные.

Чего НЕ следует делать

Абсолютно никогда не полагайтесь на скрытые поля или объекты, возвращаемые клиентом, для определения результата управляемой переменной. Вы должны всегда предполагать, что данные, отправленные клиентом, небезопасны или подделаны. Запускайте проверки, дезинфицируйте свои входные данные и пытайтесь проверить, что все, что клиент отправляет вам, является правдой.

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

person Horkrine    schedule 04.01.2018