防止在 ASP.NET Core 中的打开重定向攻击Prevent open redirect attacks in ASP.NET Core
本文内容
重定向到通过请求(如 querystring 或窗体数据)指定的 URL 的 web 应用可能会被篡改,以将用户重定向到外部恶意 URL。这种篡改称为 "开放重定向攻击"。
每当应用程序逻辑重定向到指定的 URL 时,必须验证重定向 URL 是否未被篡改。ASP.NET Core 具有内置功能来防止应用打开重定向 (也称为打开重定向) 攻击。
什么是开放重定向攻击?What is an open redirect attack?
Web 应用程序在访问需要身份验证的资源时经常将用户重定向到登录页。重定向通常包含一个 returnUrl
querystring 参数,以便用户在成功登录后可以返回到最初请求的 URL。用户进行身份验证后,会重定向到最初请求的 URL。
由于目标 URL 是在请求的查询字符串中指定的,因此恶意用户可能会篡改 querystring。篡改的 querystring 可能允许站点将用户重定向到外部的恶意站点。此方法称为 "重定向" (或 "重定向")攻击。
示例攻击An example attack
恶意用户可能会受到攻击,目的是允许恶意用户访问用户的凭据或敏感信息。若要开始攻击,恶意用户结论用户单击指向站点登录页的链接,并将 returnUrl
querystring 值添加到 URL。例如,请考虑 contoso.com
上的一个应用,该应用包括 http://contoso.com/Account/LogOn?returnUrl=/Home/About
上的登录页。攻击执行以下步骤:
- 用户单击
http://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn
的恶意链接(第二个 URL 为 "contoso1.com",而不是 "contoso.com")。 - 用户已成功登录。
- 用户被重定向(由站点)到
http://contoso1.com/Account/LogOn
(看起来与真实站点完全相同的恶意网站)。 - 用户重新登录(向恶意网站提供凭据),并被重定向回真实站点。
用户可能认为他们第一次尝试登录失败,第二次尝试成功。用户很可能仍不知道他们的凭据已泄露。
除了登录页以外,某些站点还提供重定向页面或终结点。假设你的应用程序有一个页面,其中包含一个打开的重定向 /Home/Redirect
。例如,攻击者可以创建发送到 [yoursite]/Home/Redirect?url=http://phishingsite.com/Home/Login
的电子邮件中的链接。典型用户将查看 URL,并将其以你的站点名称开头。信任这一点,他们将单击该链接。然后,打开的重定向会将用户发送到仿冒网站,该网站看上去与你的站点相同,并且用户可能会登录到他们认为是你的网站。
防范开放重定向攻击Protecting against open redirect attacks
开发 web 应用程序时,将所有用户提供的数据视为不可信。如果你的应用程序具有基于 URL 内容重定向用户的功能,请确保此类重定向仅在你的应用程序中本地执行(或对已知 URL 执行,而不是在查询字符串中提供的任何 URL)。
LocalRedirectLocalRedirect
使用基 Controller
类中的 LocalRedirect
帮助器方法:
public IActionResult SomeAction(string redirectUrl)
{
return LocalRedirect(redirectUrl);
}
如果指定了一个非本地 URL,LocalRedirect
会引发异常。否则,它的行为与 Redirect
方法相同。
IsLocalUrlIsLocalUrl
重定向之前,请使用IsLocalUrl方法测试 url:
下面的示例演示如何在重定向前检查 URL 是否是本地的。
private IActionResult RedirectToLocal(string returnUrl)
{
if (Url.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction(nameof(HomeController.Index), "Home");
}
}
IsLocalUrl
方法可防止用户无意中重定向到恶意网站。您可以记录在您需要本地 URL 的情况下提供非本地 URL 时提供的 URL 的详细信息。记录重定向 Url 有助于诊断重定向攻击。