阻止 ASP.NET Core 中的开放重定向攻击

简介

重定向到通过请求(如 querystring 或窗体数据)指定的 URL 的 web 应用可能会被篡改,以将用户重定向到外部恶意 URL。 这种篡改称为 “开放重定向攻击”。
每当应用程序逻辑重定向到指定的 URL 时,必须验证重定向 URL 是否未被篡改。 ASP.NET Core 提供内置功能,可帮助保护应用程序的打开重定向 (也称为 “开放重定向) 攻击”。

示例攻击

恶意用户可能会受到攻击,目的是允许恶意用户访问用户的凭据或敏感信息。 若要开始攻击,恶意用户结论用户单击指向站点登录页的链接,并将 returnUrl 查询字符串值添加到 URL。 例如,请考虑一个在上 contoso.com 包含登录页的应用 http://contoso.com/Account/LogOn?returnUrl=/Home/About 。 攻击执行以下步骤:、

用户可能认为他们第一次尝试登录失败,第二次尝试成功。 用户很可能仍不知道他们的凭据已泄露。

防范开放重定向攻击

开发 web 应用程序时,将所有用户提供的数据视为不可信。 如果你的应用程序具有基于 URL 内容重定向用户的功能,请确保此类重定向仅在你的应用程序中本地执行 (或到已知 URL,而不是在 querystring) 中提供的任何 URL。

LocalRedirect

使用 LocalRedirect 基类中的 helper 方法 Controller

1
2
3
4
public IActionResult SomeAction(string redirectUrl)
{
return LocalRedirect(redirectUrl);
}

LocalRedirect 如果指定了一个非本地 URL,则将引发异常。 否则,它的行为与 Redirect 方法相同。

IsLocalUrl

重定向之前,请使用 IsLocalUrl 方法测试 url:

下面的示例演示如何在重定向前检查 URL 是否是本地的。

1
2
3
4
5
6
7
8
9
10
11
private IActionResult RedirectToLocal(string returnUrl)
{
if (Url.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction(nameof(HomeController.Index), "Home");
}
}

IsLocalUrl 方法可防止用户无意中重定向到恶意网站。 您可以记录在您需要本地 URL 的情况下提供非本地 URL 时提供的 URL 的详细信息。 记录重定向 Url 有助于诊断重定向攻击。