Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 存储我的'是否安全;下一个';签名cookie中的url并无忧无虑地重定向到它?_Python_Security_Redirect_Cookies_Flask - Fatal编程技术网

Python 存储我的'是否安全;下一个';签名cookie中的url并无忧无虑地重定向到它?

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,如下所述: 是否有理

我正在使用Flask,我想这可能是一个相当优雅的解决方案,可以在登录/注销后重定向回用户的最后一页,只需在应用程序的每个端点放置一个
会话['next']=request.url
,然后让我的登录/注销函数直接重定向到
会话.get('next')
。如果为下一步启用
USE\u SESSION\u,这甚至与Flask登录扩展中的选项类似。

我想确认这是一个安全的工作流,但我不具备安全意识,无法识别是否存在欺骗request.url的方法,或者我是否应该在重定向之前验证下一个url,如下所述:


是否有理由不经常部署此方法?这似乎是一个很好的、干净的、简单的解决方案,它可以保持URL的干净,最大限度地减少字段/处理,并在您不采取额外步骤验证下一个URL的情况下消除打开重定向攻击的漏洞。有什么问题吗?

老实说,我想不出任何实用的方法来利用这个问题。相反,假设您正确地验证了其他页面上的传入请求,并且正确地实现了身份验证和访问控制,我想不出任何实际的方法来利用此漏洞。话虽如此,我对您的应用程序一无所知,而且肯定有比我聪明得多的攻击者,所以对此持保留态度

尽管如此,我看不出有任何理由不验证URL,至少是为了确保重定向到同一域上的页面。性能成本是微不足道的,我认为与登录/注销流相关的任何内容都值得额外的仔细检查。我还要确保当收到cookie中没有此字段的请求时,您有一个可接受的默认情况;DR

  • 是的,它是安全的
  • 不要担心隐藏url或防止“欺骗”。事实上,你两者都做不到,所以你要为两者都做好准备
  • 潜在错误:一旦你在会话上设置了重定向,下一次登录无论如何都会跟随它,直到会话过期。解决这一问题的一种方法是将重定向路径另存为GET参数(参见答案的底部)
  • 下面是一个用于重定向和转发安全问题的示例
  • 这是一个安全的工作流,假设您的服务器对所有安全资源的传入请求进行身份验证

    当您询问“是否应该在重定向之前验证下一个url”时,答案是“否”,但您需要验证指向该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\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'>