• .NET Core如何使用内置的功能函数序避免开放重定向攻击?
  • 发布于 2个月前
  • 190 热度
    0 评论
  • 飛雲
  • 0 粉丝 39 篇博客
  •   
Web应用程序获取查询字符串或者表单数据请求中的url地址并使用该地址进行跳转操作,跳转的地址可能会遭到篡改,将用户重定向到外部恶意url,这种篡改被称为开放重定向攻击。当你应用程序跳转到特定的url时,你必须验证跳转的url是否安全而没有被篡改,ASP.NET Core提供内置功能函数帮助我们包含应用程序避免开放重定向攻击(open redirect attacks)。

1 什么是Open Redirect Attacks
当用户访问需要授权的资源时Web应用程序会跳转用户到登录页面,跳转过程经常包含一个returnUrl在查询字符串参数中,以至于用户在登录成功之后能跳转到原始请求的url,因为在查询字符串中指定url,有可能会被篡改,如果被篡改将跳转用户到外部恶意站点,这个过程叫open redirect attacks 。

2 例子
黑客想要获取用户凭证以及一些敏感信息,为了达到目的,黑客诱导用户点击一个链接,该链接指向您网站的登录页面,并在URL中添加了一个名为 returnUrl 的查询字符串值,例如:一个应用程序包含一个如下登录页面:http://contoso.com/Account/LogOn?returnUrl=/Home/About 。

攻击步骤如下:
(1) 用户点击恶意链接http://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn,注意第二url是contoso1而不是contoso.com
(2) 用户登录成功
(3) 跳转用户到http://contoso1.com/Account/LogOn, 这个恶意站点看上去和真实站点一模一样
(4) 用户再次登录并且被返回到真实站点

用户有可能相信他们第一次登录时输错用户名和密码,第二次登录成功,用户没有意识到他们的信息已经泄露


3 防止重定向攻击
当我们开发Web应用程序时,所有用户提供的数据都是不可信任的,如果你的应用程序有基于url重定向的功能,请确保跳转的url是你应用程序中的url

3.1 LocalRedirect
使用LocalRedirect方法进行跳转:
public IActionResult SomeAction(string redirectUrl)
{
    return LocalRedirect(redirectUrl); // 堆代码 duidaima.com
}
LocalRedirect将抛出一个异常,如果该url在你应用程序中没有找到,否则它行为和Redirect方法完全一样。

3.2 IsLocalUrl
在跳转之前使用IsLocalUrl方法做判断:
private IActionResult RedirectToLocal(string returnUrl)
{
    if (Url.IsLocalUrl(returnUrl))
    {
        return Redirect(returnUrl);
    }
    else
    {
        return RedirectToAction(nameof(HomeController.Index), "Home");
    }
}
IsLocalUrl 方法可以防止用户被重定向到恶意站点,您可以记录所提供的URL的详细信息,记录重定向的URL可能有助于诊断重定向攻击。
用户评论