【问题标题】:how to protect asp.net mvc 3 site from url queries?如何保护 asp.net mvc 3 站点免受 url 查询?
【发布时间】:2012-01-08 07:35:35
【问题描述】:

我的问题是,当人们输入诸如 home/DeleteSong?id=139 之类的 url 时,他们会在家庭控制器中执行我的操作,并且可以删除歌曲和内容。我相信我可以使用 [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");
    }

我的 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") }
    });
});

【问题讨论】:

  • 不,这不能解决您的问题。

标签: asp.net-mvc-3 security url


【解决方案1】:

您的控制器应验证登录用户是否有权对指示的项目执行请求的操作,可能通过检查“所有者”字段或某些相关项目。

[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 用于所有“破坏性”或“创造性”操作,并考虑使用防伪令牌。

【讨论】:

  • 不,你不会……如果人们可以输入网址并导致某些内容被删除,则不会。
  • 他可能有一个包含歌曲列表的索引页面,单击删除链接以获取一行通过查询字符串中的 id 并将用户重定向到通过 http 帖子进行删除的确认页面。
  • 是的,可能相似,这是一个糟糕的设计还是什么?
  • @Alan “可能”?你不知道吗?您的问题一开始是说人们可以输入会导致文件被删除的 url。您是说您的问题没有准确地说明您的问题吗?
  • 检查我的编辑,我已经添加了我的 ajax 代码,以及我的操作
【解决方案2】:

当您想要执行删除内容等操作时,通常的最佳做法是使用 POST 请求。如果你考虑一下网络的本质,发出 GET 来删除某些内容有点奇怪。确保您使用 post 进行删除,并使用属性 [HttpPost] 装饰您的方法

【讨论】:

  • 我有 httpPost attr 但用户在 url 中传入了动作的名称和歌曲的参数 id
  • 如果您有 httpPost,则无法通过在浏览器中输入网址来访问该操作。
  • @Alan KMan 在这里是正确的:如果您在问题中陈述的内容确实发生了,那么您确实没有拥有用 HttpPost 修饰的正确方法。
【解决方案3】:

请记住,您还可以在控制器和操作方法上使用授权标签时指定角色。 EG:用于管理控制器或操作

[Authorize(Roles="Admin")]

如果这不适用于您的场景并且它需要自定义逻辑,那么首先在您的操作方法中添加检查。如果他们没有权限,它应该重定向到一个错误页面,指定给用户。

【讨论】:

  • 是的;返回状态码 403,例如,如果它是用户所有权事物,并且当前用户不拥有提交删除的图像 id。
【解决方案4】:

您需要要求 POST 并使用 CSRF 保护。

为此,请使用[HttpPost][ValidateAntiForgery] 属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 2012-11-19
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多