Python 存储我的'是否安全;下一个';签名cookie中的url并无忧无虑地重定向到它?
我正在使用Flask,我想这可能是一个相当优雅的解决方案,可以在登录/注销后重定向回用户的最后一页,只需在应用程序的每个端点放置一个Python 存储我的'是否安全;下一个';签名cookie中的url并无忧无虑地重定向到它?,python,security,redirect,cookies,flask,Python,Security,Redirect,Cookies,Flask,我正在使用Flask,我想这可能是一个相当优雅的解决方案,可以在登录/注销后重定向回用户的最后一页,只需在应用程序的每个端点放置一个会话['next']=request.url,然后让我的登录/注销函数直接重定向到会话.get('next')。如果为下一步启用USE\u SESSION\u,这甚至与Flask登录扩展中的选项类似。 我想确认这是一个安全的工作流,但我不具备安全意识,无法识别是否存在欺骗request.url的方法,或者我是否应该在重定向之前验证下一个url,如下所述: 是否有理
会话['next']=request.url
,然后让我的登录/注销函数直接重定向到会话.get('next')
。如果为下一步启用USE\u SESSION\u,这甚至与Flask登录扩展中的选项类似。
我想确认这是一个安全的工作流,但我不具备安全意识,无法识别是否存在欺骗request.url的方法,或者我是否应该在重定向之前验证下一个url,如下所述:
是否有理由不经常部署此方法?这似乎是一个很好的、干净的、简单的解决方案,它可以保持URL的干净,最大限度地减少字段/处理,并在您不采取额外步骤验证下一个URL的情况下消除打开重定向攻击的漏洞。有什么问题吗?老实说,我想不出任何实用的方法来利用这个问题。相反,假设您正确地验证了其他页面上的传入请求,并且正确地实现了身份验证和访问控制,我想不出任何实际的方法来利用此漏洞。话虽如此,我对您的应用程序一无所知,而且肯定有比我聪明得多的攻击者,所以对此持保留态度 尽管如此,我看不出有任何理由不验证URL,至少是为了确保重定向到同一域上的页面。性能成本是微不足道的,我认为与登录/注销流相关的任何内容都值得额外的仔细检查。我还要确保当收到cookie中没有此字段的请求时,您有一个可接受的默认情况;DR
url 1: "/login" # anyone can access this
url 2: "/secure_page" # only a logged in user can access this
假设用户未登录,并尝试导航到yoursite.com/secure\u页面
。每次都应该将它们重定向到您的登录页面。如果他们知道secure\u页面
url,那就不会影响你的安全性。事实上,他们肯定已经知道那个url,因为他们首先导航到那个页面,所以他们要么键入它,要么单击链接,要么保存在书签或浏览历史记录中。重要的是,当您处理对安全页面
的请求时,您需要将其登录
您询问他们是否可以“欺骗”重定向到的url。当您在会话中这样保存它时,它们不能。然而,他们可以在登录后点击任何他们想要的url,所以如果他们“欺骗”那个url并不重要
因此,由于他们已经知道该url,并且他们可以在登录后点击任何他们想要的url,因此您不需要对用户保密该url。这样做的唯一好处是美观上更干净的url。这就是为什么您会看到许多类似这样的登录页面:
http://yoursite.com/login?next=secure_page
他们正在将下一个url保存为HTTP GET参数。虽然它不那么“干净”,但它更明确,因此它有其优点和缺点。如果他们稍后要重新访问登录页面,那么重定向将不再发生,这可能是您想要的行为。使用当前代码,一旦重定向进入会话,之后的下一次登录将跟随重定向,直到会话过期,这可能是在用户离开并且其他人使用该web浏览器之后
很多网站都是按照我上面介绍的方式来做的。在这种情况下,恶意链接可能会提供“下一个”url并将其重定向到某个钓鱼网站,但这可以通过确保“下一个”url不会离开您的域来轻松防止
这是一个用于重定向/转发安全性的解决方案(您正在重定向,但其他登录到此处的人可能正在考虑转发请求)。正如@brendan所评论的,此解决方案可以正常工作,请使用@login\u所需的装饰程序来保护视图 两个案例: 登录 您在/index(非保护视图)>>成功登录到@login\u保护视图,在这种情况下,如果您返回,因为每个人都可以访问/index,您真的不在乎 注销
您在/profile view(protected view)>>成功注销到非保护视图,如果您返回,装饰程序将不允许您进入该视图但有一个小问题。如果您的html中有多个框架,则存在漏洞,称为点击劫持。您需要设置以下标题,以便浏览器处理其余标题
<X-Frame-Options','DENY'>