【问题标题】:PHP Session gets lost: Subdomains AND https (SSL to non-SSL)PHP 会话丢失:子域和 https(SSL 到非 SSL)
【发布时间】:2012-05-04 15:47:58
【问题描述】:

我想我在 stackoverflow 上阅读并尝试了有关“会话、跨域和 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 扩展此sn-p,但这都不起作用。
我也试过ini_set('session.cookie_domain', '.domain.com');

编辑:按照要求的答案,这里是使用的代码(最初由 Jacob 在这里发布: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 始终为空。

有什么提示吗?

【问题讨论】:

    标签: php https subdomain session-cookies


    【解决方案1】:

    与往常一样,查看一些代码会有所帮助。也许是您存储会话的部分以及您如何使用 cookie/数据库。这是一个关于如何做cross-domain authorization的很棒的教程,给这个家伙更多的点赞!

    【讨论】:

    • 巴斯特,谢谢你的回答!我刚刚添加了请求的代码。
    【解决方案2】:

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

    有关其工作原理的示例,请参见 Firesheep。

    【讨论】:

    • 感谢您的回答,乔丹·麦圭根。我没有资源通过 SSL 传输所有数据。所以我决定实现安全/资源的这种妥协。我刚刚添加了一些代码,你会改进什么?
    • 您的过滤器错误。请参阅文档:php.net/manual/en/function.filter-input.php 您还必须指定一个过滤器 php.net/manual/en/filter.filters.php 您可能想要使用 INPUT_GET。您可能还想以某种方式加密或散列会话 ID。我强烈建议建立自己的令牌。这样,您不仅可以在 HTTPS/HTTP 之间传递它,还可以将它传递给 Node.JS,并发送推送通知...
    • 谢谢 Jordan - 你是对的,我的 filter_input() 有错误。现在已修复此问题,cookie 和会话设置正确(在会话保存路径中可见),但 showAccount.php 仍然无法读取会话。我与您一起为安全问题构建自己的令牌,但它之前应该以这种基本方式工作。你还有什么提示吗?
    • 不确定,我觉得一切正常,但如果没有支持 SSL 的服务器(或开发环境),我无法对其进行测试。
    猜你喜欢
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 2010-09-23
    • 2020-08-24
    • 2012-08-16
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    相关资源
    最近更新 更多