2011-06-16 51 views
1

我有一个混合我网站的HTTP/HTTPS部分的问题,这有点难以解释。基本上,该网站的结构使得:检查安全Cookie并将HTTPS模式中的非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/模态窗口加载尝试它的父窗口上执行JS功能,http://somewhere.com


所以,我在简短形式的两难境地:

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

如果我的问题有足够的意义,我想知道:有没有办法解决这个令人沮丧的问题?或者我只是想通过HTTPS加载整个站点(包括公共和私有部分)?

+0

你可以告诉父母关闭窗口。可以调用回调函数。父母将具有关闭模式的功能,并且您将在模态窗口内传递回调。最后,模态会调用父母的功能。 – 2011-06-16 21:57:40

回答

0

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

  • 在登录时,存储两个饼干。
    1. 安全cookie包含会话密钥
    2. 不安全的cookie存储的 '授权' 状态:truefalse
  • 在不安全的页面,检查是否有不安全的cookie。
    • 如果不安全的cookie的值是true假设用户被授权和显示链接到安全的“我的帐户”页面(非模态)。
    • 一旦用户通过HTTPS访问“我的帐户”页面,就会检查安全Cookie。如果一切正常,页面将正常显示。如果会话密钥不存在或不验证,则两个cookie都将被删除,用户将重定向到主页。
  • 在安全页面上,进程保持不变 - 对安全会话密钥cookie执行检查。
  • 在注销时,使这两个cookie无效。