【问题标题】:What is the risk of form action attribute in asp net mvc?asp net mvc中表单动作属性的风险是什么?
【发布时间】:2015-12-04 19:41:52
【问题描述】:

我想知道在asp.net mvc环境中使用带有action属性的表单可能存在的风险?

例如;创建视图在 html 标记上有

任何人都可以使用 fiddler(例如)向 mydomain.com/Person/Create 发送帖子吗?

在 Jquery ajax 脚本中也非常相似。 post 或 get 方法的名称在 html 标记上可见。每个人都可以看到我页面的 html 源代码。这意味着每个人都可以看到我的操作名称。

我怎样才能对这个问题采取安全的方法?

当然,我可以在 httppost 操作上使用 Bind 属性。但我的愿望是让我的行为名称保密或有一个最佳实践想法。 (如果可能)

感谢一切。

【问题讨论】:

  • 这与 ASP.NET MVC 或 jQuery 无关。您必须在客户端上的某个地方存储您将数据发送到的位置。您可以尝试掩盖、隐藏、混淆它,但归根结底,它需要来自客户端,并且您可以访问客户端。
  • 如果您的客户端调用服务器,人们将能够拦截 URL。那里不应该有任何需要隐藏的东西。您应该专注于根据用户权限使端点安全。某人如何调用该方法并不重要,只要他们传递了有效数据即可。

标签: asp.net asp.net-mvc asp.net-mvc-4 asp.net-mvc-5


【解决方案1】:

您无法隐藏您的操作,但您可以使用 ASP.NET 内置的 Anti Forgery Tokens 在这方面完成基本的安全策略。 https://msdn.microsoft.com/en-us/library/dd470175(v=vs.118).aspx

在您的表单中,使用内置的 HTML Helper 放置一个标记:

@Html.AntiForgeryToken()

然后在你的action上,放置一个对应的属性:

[ValidateAntiForgeryToken]
[HttpPost]
[Authorize]
public ActionResult Edit()

现在您应该无法针对控制器操作模拟 POST 请求。

...正如 Sedat 在下面正确指出的那样:绝对且显然,是的,如果您不希望它们由公众。

【讨论】:

  • 这仅适用于 XSRF 攻击。它不会阻止一个人 POST 对同一操作的请求。有人仍然可以从 cookie 中检索伪造令牌,使用令牌发送 POST 请求,就像用户本人一样。为了保护对未知人执行的操作,必须执行适当的授权。
  • 我总是提倡两者的使用,Sedat。任何小事(小事,我的意思是上面的 CSRF 令牌,而不是请求授权)我们可以做的让潜在的破解者生活困难的事情对我来说很酷。
【解决方案2】:

不要隐藏你的行为。

通过执行授权来避免未经授权的访问。

通过使用反请求伪造令牌(如@Moby 的 Stunt Double 的回答),防止授权人员不情愿地执行操作(又名 XSRF 攻击)。

【讨论】:

  • 好吧,如果授权用户通过 fiddler 发布 100000(或更多)次以执行我的一项操作怎么办?
  • @oneNic​​eFriend 这意味着你让他这样做,(他被授权)。如果授权人员受到限制,您必须强制执行这些限制(例如每分钟 1 个请求等)。
【解决方案3】:

如果这是您所指的,我现在不知道。 但是,如果您不希望客户端用户知道您的操作名称,您可以使用操作的 ActionName 属性来更改它:

public class ProductsController {

    [ActionName("PublicName")]
    public ActionResult SecretName() {
        return View();
    }

}

从客户端导航的 url 将是 http://yoursite/Products/PublicName 而不是 http://yoursite/Product/SecretName

你不能完全隐藏你的动作。因为您有提琴手,所以您可以看到从客户端到服务器的任何请求,因此您可以通过这种方式知道操作的名称。

【讨论】:

    【解决方案4】:

    无需隐藏该信息,您希望客户端知道将数据发送到何处。他们如何做到这一点并不取决于您,通过浏览器、Fiddler 或其他客户端程序。更重要的是,由 GET 或 POST 产生的操作是安全的。绑定属性,例如保护您免受过度张贴。

    Emilio's 解决方案会隐藏您的操作名称,这对于提高 URL 的可读性来说很酷,但不会使其更安全,因为现在攻击者会看到公共名称,并且无论如何它们都会被路由到您的操作。

    【讨论】:

      猜你喜欢
      • 2013-05-03
      • 2011-07-20
      • 2023-03-23
      • 1970-01-01
      • 2011-03-14
      • 1970-01-01
      • 2010-09-06
      • 2013-10-02
      相关资源
      最近更新 更多