如何保护asp.net mvc 3网站免受网址查询?

Ala*_*ski 1 security url asp.net-mvc-3

我的问题是,当人们输入像home/DeleteSong这样的url?id = 139时,他们会在家庭控制器中进行操作,并且可以删除歌曲和内容.我相信我可以使用[authorize]属性,但是登录用户仍然可以输入url来使用我不希望发生的操作.我主要使用ajax请求与服务器通信,所以我应该检查我的动作是否有ajax请求,如果它是让它做的话,否则做其他事情.我想以一种方式设置我的项目,当用户键入任何网址时,我只会重定向到主页..我该怎么做,这会解决我的问题吗?

我的行动:

 [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");
    }
Run Code Online (Sandbox Code Playgroud)

我的jquery 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") }
    });
});
Run Code Online (Sandbox Code Playgroud)

And*_*ber 5

您的控制器应该验证登录用户是否有权在指定的项目上执行请求的操作,可能通过检查"所有者"字段或某些相关项目.

[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
    } 
}
Run Code Online (Sandbox Code Playgroud)

此外,您不应该基于GET请求采取操作,因为这会使您的用户暴露于跨站点请求伪造攻击.您应该始终使用POST进行所有"破坏性"或"创造性"操作,并考虑使用防伪标记.