gpt4 book ai didi

python - 将我的 'next' url 存储在签名的 cookie 中并无忧无虑地重定向到它是否安全?

转载 作者:太空狗 更新时间:2023-10-29 17:48:26 25 4
gpt4 key购买 nike

我正在使用 Flask,我突然想到在登录/注销后通过简单地放置一个 session['next'] = request.url< 重定向回用户的最后一页可能是一个相当优雅的解决方案 在我的应用程序的每个端点,并让我的登录/注销功能直接重定向到 session.get('next')。如果启用 USE_SESSION_FOR_NEXT,这甚至类似于 Flask-Login 扩展中的一个选项。

我想确认这是一个安全的工作流程,但我不精通安全,无法识别是否有任何方法可以欺骗 request.url,或者我是否仍应在重定向之前验证下一个 url,如此处指定:

http://flask.pocoo.org/snippets/62/

这种方法没有得到更广泛部署的原因是什么?这似乎是一个很好、干净、简单的解决方案,可以保持 URL 的干净,最大限度地减少字段/处理,并在您不采取额外步骤验证下一个 URL 时消除开放重定向攻击的漏洞。有什么收获?

最佳答案

长话短说

  1. 是的,它很安全。
  2. 不必担心隐藏网址或防止“欺骗”。实际上,您两者都做不到,所以您要为两者做好准备。
  3. 潜在的错误:一旦你在 session 上设置了重定向,下一次登录无论如何都会跟随它,直到 session 过期。一种补救方法是将重定向路径另存为 GET 参数(参见答案底部)。
  4. 这是一个nice cheat sheet用于重定向和转发安全问题。

这是一个安全的工作流程,假设您的服务器对所有安全资源的传入请求进行身份验证。

当您问“我是否仍应在重定向之前验证下一个 URL”时,答案是否定的,但您需要验证对该 URL 的所有请求(重定向后)以确保它们已登录。

在您的问题中,听起来您正试图对用户隐藏 url,直到他们登录为止。这不是必需的。

例如,假设您有两个网址:

url 1:  "/login"  # anyone can access this
url 2: "/secure_page" # only a logged in user can access this

假设用户未登录,并尝试导航到 yoursite.com/secure_page。他们应该每次都被重定向到您的登录页面。如果他们知道 secure_page url,那根本不会危及您的安全。事实上,他们一定已经知道那个 url,因为他们首先导航到那个页面,所以他们要么输入它,点击一个链接,要么它被保存在书签或浏览历史中。重要的是,当您处理对 secure_page 的请求时,您需要他们登录。

你问他们是否可以“欺骗”他们被重定向到的 url。他们不能,当你像那样将它保存在 session 中时。但是,他们可以在登录后点击他们想要的任何 url,因此他们是否“欺骗”该 url 并不重要。

因此,由于他们已经知道该 url,并且他们可以在登录后点击他们想要的任何 url,因此您无需对用户保密该 url。这样做的唯一好处是在美学上更简洁的 url。这就是为什么您会看到许多如下所示的登录页面:

http://yoursite.com/login?next=secure_page

那里发生的事情是他们将下一个 url 保存为 HTTP GET 参数。虽然它不太“干净”,但更明确,因此它有利有弊。如果他们稍后重新访问登录页面,将不再发生重定向,这可能是您想要的行为。使用您当前的代码,一旦重定向在 session 中,此后的下一次登录将遵循重定向直到 session 过期,这可能是在用户离开并且其他人使用该 Web 浏览器之后。

许多网站都按照我上面显示的方式进行操作。 Django does it that way .在这种情况下,恶意链接可能会提供“下一个”URL 并将其重定向到某个网络钓鱼站点,但可以通过确保“下一个”URL 不会离开您的域来轻松防止这种情况。

这是一个basic cheat sheet用于重定向/转发安全(您正在重定向,但其他登陆此处的人可能正在考虑转发请求)。

关于python - 将我的 'next' url 存储在签名的 cookie 中并无忧无虑地重定向到它是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43560155/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com