【问题标题】:ASP.NET MVC security when calling an action directly直接调用操作时的 ASP.NET MVC 安全性
【发布时间】:2015-10-03 15:14:09
【问题描述】:

我有一个名为 Account 的控制器和一个名为 AddFunds() 的操作

在我的 HttpGet Addfunds() 操作中,我将视图绑定到具有 AccountId 属性的 ViewModel,因此默认情况下,视图包含一个名为 AccountId 的隐藏字段。

HttpPost AddFunds() 操作中,我收到了更新后的 ViewModel,其 AccountID 与 HttpGet 方法传递的相同,还有一些其他参数,例如 Amount 等。

我可以做些什么来防止一个人调用该方法直接传递一个假的AccountId?

AntiForgery 令牌会阻止这种情况吗? 我应该采取其他措施吗?

作为一个附带问题,是否可以避免在隐藏字段中传递 AccountID,或者是否有必要知道我在处理哪个实体?

谢谢

【问题讨论】:

  • 不要描述你的代码,直接贴出来。
  • 简短的回答是,在允许任何类型的更改之前,您需要将传递的 AccountID 与经过身份验证的用户的 AccountID 进行比较。然而,这是一个相当大的话题,您应该阅读安全性如何为您的 asp.net mvc 应用程序工作。这是一个好的开始blogs.msdn.com/b/rickandy/archive/2012/03/23/…

标签: c# asp.net asp.net-mvc security asp.net-mvc-4


【解决方案1】:

第一件事 - 你真的应该避免对数据/ID 使用隐藏字段,这些字段将被传递给控制器​​的操作并表示一些真实且可能很重要的数据。

如果您关心用户,谁有可能操纵 ID,您应该引入非确定性 ID(如 GUID)。

防伪令牌用于防止执行 CSRF 攻击。

【讨论】:

  • 嗨@Kamo,隐藏字段中的 ID 默认由脚手架功能创建。你如何避免这种情况?我们有什么选择?
  • @IGIT 您必须提供有关此功能的更多详细信息。
【解决方案2】:

您可以在将值传递给 post 操作时加密 Id,并在需要的任何地方在 post 方法中解密该 id。

您的网址将是:localhost:3040/home/edit?AccountId=hkdshjlk89890-32(encryptedid)

或者你可以使用base64编码和解码(我不会推荐base64,因为每个人都会解码值)。

其他解决方案,您可以查看以下链接 Only allow access to action if redirected from specific action

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    相关资源
    最近更新 更多