как защитить сайт asp.net mvc 3 от URL-запросов? - PullRequest
1 голос
/ 07 января 2012

Моя проблема в том, что когда люди вводят в URL что-то вроде home / DeleteSong? Id = 139, они получают доступ к моим действиям в домашнем контроллере и могут удалять песни и прочее.Я полагаю, что могу использовать атрибут [authorize], но не вошедшие в систему пользователи по-прежнему смогут вводить URL, чтобы использовать мои действия, чего я не хочу, чтобы они происходили.В основном я использую ajax-запросы для связи с сервером, поэтому я должен проверить свои действия на ajax-запрос, и если он разрешен, то это сделать иначе, сделать что-то еще.Я хотел бы настроить свой проект таким образом, чтобы при вводе пользователем любого URL-адреса я просто перенаправлял на домашнюю страницу ... как мне это сделать, и это решило бы мою проблему?

мое действие:

 [HttpPost]
    public ActionResult DeleteTopTenFav(int id)
    {
        var song = repository.GetTopTenFav(id);

        var points = repository.FindPoints(song.UserName);
        foreach (var item in points)
        {
            item.TopTenFav = null;
        }

        repository.DeleteTopTenFav(song);
        repository.Save();
        return RedirectToAction("Index");
    }

Функция удаления jjery ajax:

   $("#topTenContainer").on("click", ".btnDeleteTopTenFavSong", function () {
    var button = $(this);
    var songId = $(this).attr('name');

    $.ajax({
        beforeSend: function () { ShowAjaxLoader(); },
        type: 'POST',
        url: "/Home/DeleteTopTenFav/",
        data: { id: songId },
        success: function () { HideAjaxLoader(), ChangeColorShowMsg("green"), ShowSuccessMsgAndReplaceTopTenSong("Song deleted successfully", button) },
        error: function () { HideAjaxLoader(), ChangeColorShowMsg("red"), ShowMsg("Song could not be deleted, please try again") }
    });
});

Ответы [ 4 ]

5 голосов
/ 07 января 2012

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

[HttpPost]
[Authhorize]
public ActionResult Delete(int id)
{
    var image = repo.GetImage(id);
    if(image.UploadedByUser.id == User.Identity.Name)
    {
      // .... do the delete
    }
    else
    {
       //...don't do it
    } 
}

Кроме того, вы не должны предпринимать действия, основанные на запросах GET, поскольку это подвергает ваших пользователей атакам подделки межсайтовых запросов. Вы должны всегда использовать POST для всех «разрушительных» или «творческих» действий и рассмотреть возможность использования токена защиты от подделки.

1 голос
/ 07 января 2012

Помните, что вы также можете указывать роли при использовании тега authorize на ваших контроллерах и методах действий. EG: для административных контроллеров или действий

[Authorize(Roles="Admin")]

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

1 голос
/ 07 января 2012

Обычно рекомендуется использовать POST-запросы, когда вы хотите выполнить такие действия, как удаление чего-либо.Если вы думаете о природе Интернета, странно выдавать GET, чтобы что-то было удалено.Удостоверьтесь, что вы выполняете удаление с помощью post и украшаете ваши методы атрибутом [HttpPost]

0 голосов
/ 07 января 2012

Вы должны требовать POST и использовать защиту CSRF.

Для этого используйте атрибуты [HttpPost] и [ValidateAntiForgery].

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