2012-04-24 81 views
2

我想我在「stackoverflow」上閱讀並嘗試了關於「會話,跨域和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總是空的。

有什麼提示嗎?

回答

0

一如既往,看到一些代碼會有所幫助。也許您存儲會話的部分以及您如何使用Cookie /數據庫。這裏是一個關於如何做cross-domain authorization真棒教程,給這個傢伙一些更多upvotes!

+0

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

1

保護只是您的登錄/授權毫無意義。正在查看網絡流量的攻擊者可以竊取每次請求傳遞給服務器的登錄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