RedirectToAction 是否存在安全风险?

Does RedirectToAction pose a security risk?

我有一个通过安全表单进入的 HTTPS post。无需冗长的解释:我需要在同一个控制器中调用一个动作,该动作接受两个作为参数传递的标记。当我使用 运行 Fiddler 时,我看到正在使用 URL 中的参数调用该方法。我的问题是:这会带来安全风险吗?在同一个控制器内是否有更安全的重定向方式?

是的,它会带来安全风险,但只需验证您要重定向到的 url 与您的源目标位于同一域内即可轻松缓解。

事实上,这是 OWASP 前 10 名。

A10 - Unvalidated Redirects and Forwards

编辑:

我刚刚意识到我错过了问题的 "ToAction" 部分,所以没有.. 使用 RedirectToAction 重定向到网站外部是不可能的,所以不用担心。但是,如果您使用直接用户输入输入您的 RedirectToAction(包括接受您在不同页面中生成的 post 数据),那么攻击者可能会重定向到您没有预料到的方法。然而,这与用户简单地尝试随机 URL 并点击一个,或者知道 url 并手动进入它没有什么不同。您需要获得授权才能阻止访问 URL 用户无权查看的内容。

如果通过 HTTPS 访问原始操作,则 RedirectToAction 将重定向到使用相同协议的同一域上的相对 URL。

因此,如果您的原始页面是

https://www.example.com/Foo/Bar

这会重定向到带有一些路由参数的 FooBar 操作:

https://www.example.com/Foo/FooBar/1/2/3

攻击者无法读取参数1/2/3或URL的其余部分。

但是,您应该记住的事情是:

  • 默认情况下,URL 参数将由浏览器(历史记录)、您的服务器、企业代理服务器以及您网络上的其他设备默认记录。
  • 如果用户点击从您的页面到其他 https URL 的任何链接,referer HTTP header 将包含您的页面地址和参数。不过,现代浏览器不会发送带有 http 链接的 referer header。
  • 如果您的页面上还有任何其他 https 资源,这将导致浏览器随请求发送 referer header。

出于这些原因,如果您的参数 (1/2/3) 是私有的,那么您可能希望将此数据 POST 传送到目标页面而不是使用 RedirectToAction(这会导致GET).

请注意,您应该验证当前用户是否有权访问 1/2/3 引用的资源(例如,如果参数是订单 ID,您应该检查由其身份验证 cookie 识别的用户是否允许他们查看引用的顺序)。保持 1/2/3 私有只有在参数本身是敏感的(例如社会安全号码)时才有用。

请注意,OWASP Top 10 漏洞 "A10 - Unvalidated Redirects and Forwards" 不适用于此处,因为 RedirectToAction 只能重定向到另一个操作。如果其他操作重定向到用户集 URL,那么漏洞就会存在。