PHP会话丢失:子域和https(SSL到非SSL)

问题描述:

我想我在“*”上阅读并尝试了关于“会话,跨域和ssl”的所有相关主题。不幸的是没有用。PHP会话丢失:子域和https(SSL到非SSL)

我的情况下:

loginForm.html(非SSL) - > authUser.php(SSL) - > showAccount.php(非SSL)

的问题是,即这些文件放置在不同的子域中,并通过SSL或非SSL服务。

loginForm.html - >http://dev.domain.com
authUser.php - >https://ssl.domain.com
showAccount.php - >http://dev.domain.com

如果用户凭据是正确的,authUser.php应该创建使用该会话通过showAccount.php

如前所述,我尝试了所有发布的解决方案。 供参考,我们来看看这个:Session lost when switching from HTTP to HTTPS in PHP
我也试着扩展这个片段,如PHP Sessions across sub domains中所提到的session_set_cookie_params,但这不起作用。
我也试过ini_set('session.cookie_domain', '.domain.com');

编辑:正如在回答要求,这里是使用的代码(最初被张贴雅各这里:Session lost when switching from HTTP to HTTPS in PHP

https://ssl.domain.com/user/authUser.php

<?php 

// auth with database was successful, so create the session 

session_set_cookie_params(0, '/', '.domain.com'); 
session_start(); 

$currentSessionID = session_id(); 
$_SESSION['testvariable'] = 'It worked'; 
$InsecureServerDomain = 'dev.domain.com'; 
$pagePath = '/showAccount.php'; 

echo '<a href="http://' . $InsecureServerDomain . $pagePath . '?session=' . $currentSessionID . '">Transfer Cookie from secure to insecure </a>'; 

?> 

http://dev.domain.com/showAccount.php

<?php 

$currentSessionID = filter_input(GET, "session"); 
session_set_cookie_params(0, '/', '.domain.com'); 

session_id($currentSessionID); 

session_start(); 

if (!empty($_SESSION['testvariable'])) { 
     echo $_SESSION['testvariable']; 
} else { 
     echo 'It did not work.'; 
} 

?> 

$_SESSION总是空的。

有什么提示吗?

一如既往,看到一些代码会有所帮助。也许您存储会话的部分以及您如何使用Cookie /数据库。这里是一个关于如何做cross-domain authorization真棒教程,给这个家伙一些更多upvotes!

+0

巴斯特,谢谢你的回答!我刚刚添加了所需的代码。 – Andrew 2012-04-24 10:08:04

保护只是您的登录/授权毫无意义。正在查看网络流量的攻击者可以窃取每次请求传递给服务器的登录cookie /会话令牌,然后以该用户身份登录。当然,密码将是安全的,但它实际上并不能保护用户的会话免受中间人攻击(例如在不安全的WiFi网络中)的劫持。

有关如何工作的示例,请参阅Firesheep。

+0

谢谢你的回答,乔丹麦圭根。我没有通过SSL传输所有数据的资源。所以我决定实施这种安全/资源的妥协。我只是添加了一些代码,你会改进什么? – Andrew 2012-04-24 10:10:01

+1

你的过滤器是错误的。请参阅文档:php.net/manual/en/function.filter-input.php您还必须指定一个过滤器php.net/manual/en/filter.filters.php您可能要使用INPUT_GET。您可能还想以某种方式加密或散列会话ID。我强烈建议建立你自己的令牌。这种方式不仅可以在HTTPS/HTTP之间传递,还可以传递给Node.JS,并发送推送通知... – 2012-04-24 12:59:36

+0

感谢乔丹 - 你说得对,我的filter_input出错了()。这现在已经修复,cookie和会话设置正确(在会话保存路径中看到),但是'showAccount.php'still无法读取会话。我与你一起建立自己的安全问题标记,但它应该以这种基本方式工作。你有更多的提示吗? – Andrew 2012-04-24 13:19:44