2009-08-13 151 views
4

我發現這個問題#2的來源。它是利用了session_register(富)的。成立了以會話的登錄系統,PHP

我把以下內容添加到我的handle_registration.php

session_register("foo"); 
session_register("foo2"); 

$foo2 = $_POST['email']; 
$foo['email'] = $_POST['email'] 

問題仍然存在,因爲沒有變量存儲到我的會話cookie中。


這是我的login script的邏輯。

  1. 解決了Pascal MartinThe Disintegrator這是把功能session_write_close中產生的登錄會話的正確的地方?
  2. 你怎麼能得到一個永久的會話用戶「會話」,使得一個新的會話沒有啓動,每次的index.php加載?

我的session_start()在我的index.php的開頭。

我的index.php之初

session_start();  
if($_SESSION['logged_in'] == false) { 
    $random_number = rand(1,100000);              
    session_id($random_number); 
    session_id['email'] = ''; 
} 

,而我的index.php的盡頭

<?php 
session_write_close();  // Session code ends here! 
?> 

我的會話代碼驗證的最開始之後有用戶密碼過程由

$dbconn = pg_connect("host=localhost port=5432 dbname=masi user=masi password=123"); 
$result = pg_prepare($dbconn, "query22", "SELECT passhash_md5 FROM users 
     WHERE email=$1;"); 

$passhash_md5 = pg_execute($dbconn, "query22", array($_REQUEST['email']));  
// users from registration/login form 
if ($passhash_md5 == md5($_REQUEST['password'])) { 
    $_SESSION['logged_in'] = true; 
    $_SESSION['email'] = $_REQUEST['email']; 
    $_SESSION['passhash_md5'] = md5($_REQUEST['password']); 
} 

// this may be unnecessary if the passhash_md5 cannot be changed by the user 
$passhash_md5_2 = pg_execute($dbconn, "query22", array($_SESSION['email'])); 
// users staying in the site 
if ($passhash_md5_2 == $_SESSION['passhash_md5'])) { 
    $_SESSION['logged_in'] = true; 
} 

該代碼會生成持續的隨機會話,從而不會爲用戶保存任何用戶的數據。 我在我的代碼$_SESSION更換登錄/註冊處理程序後每個$_REQUEST,因爲$_REQUEST不包括$ _SESSION - 仍然是同樣的問題,我無法看到用戶名登記/登錄後的首頁。

回答

2

你的代碼如下:session_regenerate_id之前

       -- content cut -- 
</html> 
<?php 
session_regenerate_id(true);    // Session code ends here! 
session_write_close(); 
?> 

您definitly有一些輸出(網頁的全部內容,實際上)被調用;因此錯誤。

問題不在於「空行」或空格:它與輸出;和HTML輸出 ;-)

像調用session_start,以session_regenerate_id呼叫應在腳本的開始做,事情之前發送給瀏覽器。
所以,在這裏,您的index.php的「頂部」的塊。


編輯:更多的想法。

BTW?我不確定你真的需要撥打session_write_close;我可能從未使用過該功能,我相信......而且,引述商務部:

會話數據通常存儲後 你的()腳本終止而不 需要調用session_write_close

唯一的情況下,你可能需要調用這個函數自己是如果你正在做久算了一筆賬:

會話數據被鎖定,以防止 併發寫入只有一個腳本可能 隨時在會話中操作。當 將幀集與會話 一起使用時,由於此鎖定,您將逐個體驗加載 的幀。您可以通過在會話 變量完成對會話的所有更改後儘快將會話結束爲 來減少加載所有 幀所需的時間。

但是,這似乎不是你的情況,因爲你在你的腳本結尾處調用它。

所以,你可以嘗試刪除(沒用?)調用該函數...


而且,關於session_regenerate_id:你真的需要調用每一頁上這個功能呢?

我想永遠不會打電話給你的網站就足夠了......即使你可能想在用戶登錄時調用它,但爲了安全防範措施(如果我沒有記錯的話,很高興每當調用此函數時用戶的權限級別發生變化)

一樣的session_id,btw:你真的需要在每個頁面上調用這個函數嗎?

+0

謝謝你解決第一個問題! – 2009-08-13 05:08:06

+0

不客氣:-)我已經編輯了幾個更多想法的答案;也許他們也會幫忙...... – 2009-08-13 05:53:54

+0

謝謝你對第二次更新的解釋! - 我實施了改進建議。該網站連續不斷地生成會話ID,以便用戶的數據不會傳輸到下一頁。 – 2009-08-13 13:44:25

3

您應該使用輸出緩衝,以防止這種

<?php 
ob_start(); 
everything here 
ob_end_flush(); 
?> 

一次正常輸出發生無法發送頭。

+0

PHP的一個很好的做法是不要在文件底部完成<?php標記。這將防止以這種方式產生無意的輸出。 您看到的實際錯誤消息是由於您的頭文件已被髮送。在您已經將標題寫出後,您無法在標題中發送新的Cookie(以更改session_id)。 – TheJacobTaylor 2009-08-13 04:41:14

+0

這就是說,在php文件的底部使用session_regenerate_id是一個小小的誤導。 – TheJacobTaylor 2009-08-13 04:41:57

+3

也許這是一個強迫症,但我不能讓一個標籤不公開。我需要幫助嗎? – 2009-08-13 04:47:23

1

session_regenerate_id - 與更新當前會話ID的新生成一個

如果你使用它,你現在的樣子,你會一遍又一遍產生新的會話。

session_id - 獲取和/或設置當前會話ID

你每次設定一個新的會話與一個隨機數。

實際上,您唯一需要使用的會話是在腳本的開頭放置一個session_start()語句。

+0

我實施了您的改進建議。我的網站不斷重新生成會話ID,以便用戶的數據不會傳輸到下一頁。 – 2009-08-13 13:43:37

+0

我還沒有看到您的評論。你還有問題嗎? – 2009-08-26 01:31:03