【问题标题】:Is there an attribute in MVC to limit Controller Actions to posts from a specific site?MVC 中是否有一个属性可以将控制器操作限制为来自特定站点的帖子?
【发布时间】:2015-01-20 18:05:48
【问题描述】:

我有一个 ajax 调用,用于启动从 SPA 到 MVC 应用程序中的控制器的“忘记密码”过程,如下所示:

[HttpPost]
public JsonResult ResetPassword(User acct)
{
  ...
}

我希望有一种方法可以将此控制器限制为仅来自该页面的帖子。我想我可以编写一个自定义属性,但我希望这是一个足够常见的问题,有人已经这样做了。是的,我意识到伪造标头以包含欺骗性引用数据是可能的,但是增加的安全层会让我更加放心。或者有没有人建议更好的方法来完成同样的事情?

感谢您的帮助!

【问题讨论】:

  • 鉴于人们仍然可以伪造标题,我想说您的“安心”可能比真实更妄想(我说的很好。)您仍然必须解决无论如何,更大的整体安全图景,那么您实际上获得了什么?

标签: asp.net-mvc security referrer


【解决方案1】:

简短的回答是你不能。如前所述,您可以尝试使用引荐来源标头 (HttpRequest.Referrer),但由于多种原因它并不可靠:

  • 这不是必需的标头,
  • 您依赖于渲染代理(例如,客户端浏览器)来设置它 [老实说],并且
  • 可以更改。例如,如果请求被代理,则可以将其设置为代理 URL。

HttpRequest.UserHostAddress 可能更可靠一些。但同样,您不能真正依赖它:它是请求来自的 IP 地址,但同样,如果请求被代理或通过防火墙,您可能会获得代理地址,而不是实际的客户端IP地址。

最可靠的方法是通过证书实现客户端身份验证:

虽然有点麻烦:客户端必须提供正确的证书作为请求的一部分,而服务器也必须有匹配的证书。

【讨论】:

【解决方案2】:

您可以在 HTTP 中检查 referer header。这将为您提供发出请求的页面。

是的,您必须注意这是不安全的,因为任何 HTTP 标头都很容易被欺骗。

【讨论】:

    【解决方案3】:

    【讨论】:

    • 这将是完美的!我想我可以根据需要调整它。我没有直接调用我的 API。 JQuery 正在调用这个 MVC 控制器,它(除其他外)将请求中继到仅限内部的 API。所以我认为仍然可以以与他们所做的类似的方式使用防伪令牌。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    相关资源
    最近更新 更多