在HTTPS模式中检查安全cookie并重定向非HTTPS父级


Checking for a secure cookie and redirecting a non-HTTPS parent inside an HTTPS modal

我的网站中混合了HTTP/HTTPS部分,这有点难以解释。基本上,网站的结构是这样的:

  • 主页和公共内容页面通过HTTP发送
  • 所有需要授权的页面都通过HTTPS发送

我正在向网站添加"记住我"功能,在该功能中,会话密钥以安全cookie发送给用户。这对网站的授权区域(HTTPS)非常有效——我可以为用户删除PHP会话,当我再次访问这些授权页面时,它将由安全会话密钥cookie重新创建。

我在网站的页面上有一个未加密的登录按钮。这个登录按钮启动一个模式窗口,该模式窗口的内容通过HTTPS传输。安全会话密钥cookie是在该模式窗口的请求中发送的,因为它是通过安全连接发送的如果检测到此会话密钥cookie,我需要关闭模式窗口并将父页面重定向到网站的授权部分

// this script running on https://somewhere.com/account/ in an iframe
// whose parent is http://somewhere.com/ (non-HTTPS)
<?php if ( $already_authorized ): ?>
    <script type="text/javascript">
        $(document).ready(function redirectParent() {
            parent.jQuery.fancybox.close();
            parent.window.location.href = 'https://somewhere.com/account/';
        });
    </script>
<?php endif ?>

不过,由于从https://somewhere.com/account/加载的模式窗口试图在其父窗口http://somewhere.com上执行JS函数,因此我遇到了跨域脚本阻止的问题。


因此,我的困境简而言之:

  • 不安全的页面包含指向模式登录窗口的链接,该窗口通过HTTPS加载
  • 模式登录窗口可以检查会话密钥cookie,因为它是通过安全连接发送的
  • 然而,模态登录窗口不能告诉它的父窗口使用JS关闭,因为它是通过不同的协议加载的
  • 无法通过不安全的连接加载模式登录窗口。这将允许JS访问父级,但安全cookie将不可用

如果我的问题有足够的道理,我想知道:有什么方法可以解决这个令人沮丧的问题吗?还是我最终会通过HTTPS加载整个网站(包括公共和私有部分)?

我找到了一个解决方案!它可能不是最优雅的,但就我所见,它可以工作并保持相同的安全级别。

  • 登录时,存储两个cookie。
    1. 包含会话密钥的安全cookie
    2. 存储"已授权"状态的非安全cookie:truefalse
  • 在不安全的页面上,检查不安全的cookie。
    • 如果不安全cookie的值为true,则假设用户已获得授权,并显示安全"我的帐户"页面的链接(非模态
    • 一旦用户通过HTTPS访问"我的帐户"页面,就会检查安全cookie。如果一切正常,页面将正常显示。如果会话密钥不存在或未验证,则会删除两个cookie,并将用户重定向到主页
  • 在安全页面上,过程保持不变——对安全会话密钥cookie进行检查
  • 注销时,使两个cookie失效