【问题标题】:Javascript redirect vulnerabilityJavascript 重定向漏洞
【发布时间】:2022-10-04 19:28:52
【问题描述】:

假设我将 url 路径存储在像 /?return_back_to=/foo/bar 这样的查询参数中

然后将其传递给像 Microsoft 这样的外部身份验证服务,该服务进行登录并使用我的查询参数返回相同的 url。

此时,从查询参数中获取值并使用 React navigate() 重定向到此 url 是否安全?还是这被认为是“开放重定向漏洞”?

【问题讨论】:

    标签: javascript reactjs authentication security redirect


    【解决方案1】:

    从表面上看,只要遵循一堆最佳实践并验证查询参数,就应该可以保存使用它,而不是“开放重定向漏洞”。

    您提到使用 Microsoft auth 服务,我个人没有太多经验,但我已经使用了很多 firebase 和 google auth,我知道它们会自动检查,如果重定向 URL 未列入白名单,它将无法正常工作。 firebase 会自动将 localhost 和您的应用程序域添加到白名单,如果您有希望将用户重定向到的外部链接,您可以添加更多。

    来源 1:https://support.google.com/firebase/answer/6400741?hl=en

    来源 2:https://support.google.com/firebase/answer/9021429?hl=en

    就在用户实际返回您的应用程序时使用 react navigate() 是否安全而言,您应该确保根据本地白名单检查 URL,或者在重定向用户之前将您的应用程序域添加到 URL。

    navigate({safeDomain} + {query parameter})

    虽然我应该提到,如果 navigate() 指的是 useNavigate() 钩子,我认为你不能使用它,你需要使用 redirect()

    mitigating against open redirect vulnerability 的一些更有用的信息

    我希望这可以帮到你!

    【讨论】:

    • 我认为redirect()navigate() 都可以。这取决于在组件中执行重定向的位置。 redirect() 工作在新的 v6.4 样式 loaderRouteaction 属性中。 reactrouter.com/en/main/start/overview#redirects 但是navigate(path, { replace: true })里面的内容也会有同样的效果。
    【解决方案2】:

    这取决于谁在调用该端点。知名身份提供者将要求您设置允许的重定向 url,并且只会发回授权的(您设置的)。所以他们只会在没问题的情况下调用回调,这样你就可以安全地重定向。

    但是,其他任何人都可能使用带有不同参数的此 url(指向它的链接),您不想导航到该参数,这将是一个开放重定向。因此,您需要确保请求实际上来自受信任的来源,即。来自 Azure AD。根据您实施的流程,您可以验证收到的令牌以确保它是有效请求,或者至少您可以检查 Origin / Referer 标头以查看调用者是谁(无法更改Javascript 中的 Origin 或 Referer,因此攻击者无法让合法用户访问带有恶意重定向的链接,其 Origin 来自 Microsoft)。

    此外,如果您只在自己的源(域)中重定向,您可以并且应该添加重定向路径 (return_back_to) 是内部的验证,例如以 / 开头和/或不包含 ://

    【讨论】:

      猜你喜欢
      • 2014-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      • 2015-10-12
      • 1970-01-01
      相关资源
      最近更新 更多