阻止 ASP.NET Core 中的开放重定向攻击
简介
重定向到通过请求(如 querystring 或窗体数据)指定的 URL 的 web 应用可能会被篡改,以将用户重定向到外部恶意 URL。 这种篡改称为 “开放重定向攻击”。
每当应用程序逻辑重定向到指定的 URL 时,必须验证重定向 URL 是否未被篡改。 ASP.NET Core 提供内置功能,可帮助保护应用程序的打开重定向 (也称为 “开放重定向) 攻击”。
示例攻击
恶意用户可能会受到攻击,目的是允许恶意用户访问用户的凭据或敏感信息。 若要开始攻击,恶意用户结论用户单击指向站点登录页的链接,并将 returnUrl 查询字符串值添加到 URL。 例如,请考虑一个在上 contoso.com 包含登录页的应用 http://contoso.com/Account/LogOn?returnUrl=/Home/About 。 攻击执行以下步骤:、
- 用户单击恶意链接 http://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn (第二个 URL 为 “contoso 1 .com”,而不是 “contoso.com” ) 。
- 用户已成功登录。
- 站点) (重定向用户, http://contoso1.com/Account/LogOn (与真实站点) 完全相同的恶意网站。
- 用户再次登录 (向恶意网站提供凭据) 并被重定向回真实站点。
用户可能认为他们第一次尝试登录失败,第二次尝试成功。 用户很可能仍不知道他们的凭据已泄露。
防范开放重定向攻击
开发 web 应用程序时,将所有用户提供的数据视为不可信。 如果你的应用程序具有基于 URL 内容重定向用户的功能,请确保此类重定向仅在你的应用程序中本地执行 (或到已知 URL,而不是在 querystring) 中提供的任何 URL。
LocalRedirect
使用 LocalRedirect
基类中的 helper
方法 Controller
:
1 |
|
LocalRedirect
如果指定了一个非本地 URL
,则将引发异常。 否则,它的行为与 Redirect
方法相同。
IsLocalUrl
重定向之前,请使用 IsLocalUrl
方法测试 url:
下面的示例演示如何在重定向前检查 URL 是否是本地的。
1 |
|
此 IsLocalUrl
方法可防止用户无意中重定向到恶意网站。 您可以记录在您需要本地 URL 的情况下提供非本地 URL 时提供的 URL 的详细信息。 记录重定向 Url 有助于诊断重定向攻击。