防止在 ASP.NET Core 中的打开重定向攻击Prevent open redirect attacks in ASP.NET Core

每当应用程序逻辑重定向到指定的 URL 时,必须验证重定向 URL 是否未被篡改。ASP.NET Core 具有内置功能来防止应用打开重定向 (也称为打开重定向) 攻击。

Web 应用程序在访问需要身份验证的资源时经常将用户重定向到登录页。重定向通常包含一个 querystring 参数,以便用户在成功登录后可以返回到最初请求的 URL。用户进行身份验证后,会重定向到最初请求的 URL。

由于目标 URL 是在请求的查询字符串中指定的,因此恶意用户可能会篡改 querystring。篡改的 querystring 可能允许站点将用户重定向到外部的恶意站点。此方法称为 "重定向" (或 "重定向")攻击。

  • 用户已成功登录。
  • 用户被重定向(由站点)到 (看起来与真实站点完全相同的恶意网站)。
  • 用户重新登录(向恶意网站提供凭据),并被重定向回真实站点。
    用户可能认为他们第一次尝试登录失败,第二次尝试成功。用户很可能仍不知道他们的凭据已泄露。

除了登录页以外,某些站点还提供重定向页面或终结点。假设你的应用程序有一个页面,其中包含一个打开的重定向 /Home/Redirect例如,攻击者可以创建发送到 [yoursite]/Home/Redirect?url=http://phishingsite.com/Home/Login的电子邮件中的链接。典型用户将查看 URL,并将其以你的站点名称开头。信任这一点,他们将单击该链接。然后,打开的重定向会将用户发送到仿冒网站,该网站看上去与你的站点相同,并且用户可能会登录到他们认为是你的网站。

防范开放重定向攻击Protecting against open redirect attacks

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

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

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

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

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