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,那么漏洞就会存在。
我有一个通过安全表单进入的 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,那么漏洞就会存在。