2011-05-15 36 views
0

我使用PHP會話和mySQL爲我的網站創建了一個用戶帳戶系統。我一直在努力讓它長期得到正確的運作。第一個晚上它的工作「大部分」是正確的。從那時起,我幾乎沒有任何進展。我一直在研究和谷歌搜索,直到我燒壞了,我還沒有弄明白。爲什麼我的會話在手動訪問時仍然保留在其他頁面上,而不是在遵循鏈接時保留?

問題是,我可以創建用戶帳戶很好,並按計劃在我的sql數據庫中註冊,我甚至可以正確登錄。但是,當我訪問我網站上的其他頁面時,會話似乎不在這些頁面上註冊。我檢查用戶的會話與

if (isset($_SESSION['username'])) 

如果他們沒有登錄,每個頁面上的主菜單上出現「登錄」按鈕。如果他們已登錄,則會出現一個帶有用戶名的按鈕,鏈接到他們的帳戶頁面。如果你想自己看,www.glorygamer.com是網站,你可以使用testAccount和密碼作爲登錄和看到的密碼。

這是奇怪的部分。今天我做了一個發現,現在我確定它不是我的PHP腳本的問題。如果我手動輸入我想要訪問的頁面(如果我真的鍵入「www.glorygamer.com/account_home.php」,那麼它完美地工作。會話總是以我以這種方式訪問​​的任何頁面正確啓動。但是,當我點擊我的菜單中的鏈接,它似乎幾乎隨機工作,有時我會被髮送到下一頁,會話將正確啓動,有時它不會。

是否有一些特殊的方式我需要鏈接我的網頁,儘管它們都正確的session_start()之前別的

這裏是登錄腳本:

<?php session_start(); 
//pass info to mysql(servername, username, password) 
$connect = mysql_connect ("localhost", "***", "***"); 
if (!$connect) 
{ 
     die ('Failed to connect: ' . mysql_error()); 
} 
mysql_select_db("ggstudio_accountDatabase", $connect); 

//capture data sent to page through login 
//usernameField and passwordField 

$usernameSubmission = $_POST['usernameField']; 
$passwordSubmission = $_POST['passwordField']; 

$validAccount = mysql_query("SELECT * FROM userAccounts WHERE userID = '$usernameSubmission' AND userPassword = '$passwordSubmission'"); 
$row = mysql_fetch_array($validAccount); 
if (($row['userID'] == $usernameSubmission)&&($row['userPassword'] == $passwordSubmission)) 
{ 
/********************************* 
********************************** 
assign global variables to session 
after starting session and then*** 
redirect to user homepage********* 
********************************** 
********************************** 
*/ 
//get account number from database 
$_SESSION['accountNumber']= $row['accountNumber']; 
//get first name from database 
$_SESSION['firstName']= $row['firstName']; 
//get last name from database 
$_SESSION['lastName']= $row['lastName']; 
//save username into session 
$_SESSION['username']= $row['userID']; 
//save password into session (only really useful if user wants to change password) 
$_SESSION['userPassword']= $row['userPassword']; 
//get user's email address from database 
$_SESSION['userEmail']= $row['userEmail']; 
//get GP from database 
$_SESSION['gpoints']= $row['userGloryPoints']; 
//get user join date from database 
$_SESSION['userJoinDate']= $row['userJoinDate']; 
//get user rank 
$_SESSION['userRank']= $row['userRank']; 

session_write_close(); 
header('Location: http://www.glorygamer.com/account_home.php'); 
exit; 
} 
else 
{ 
$loginFailed= TRUE; 
setcookie("incorrectLogin", $loginFailed, time()+20); 
session_write_close(); 
header('Location: http://www.glorygamer.com/shibboleth.php'); 
exit; 
} 
?> 
+3

您的PHP安裝是否使用會話cookie?你能試着找出他們會發生什麼事嗎?你是否確定每個文件中只有一個'session_start()'?你能告訴你如何初始化會話嗎? – 2011-05-15 21:30:13

+0

我將用於登錄用戶的腳本(在其中開始會話)添加到我原來的問題中。 – rbusch90 2011-05-15 22:07:21

回答

0

它吮吸,我缺乏6分的問題評論,因此我必須使用一個答案...在我的測試中,似乎你的問題是腳本依賴,因爲我無法看到右上角的登錄狀態,即使我訪問另一個URL (例如來自外部的.glorygamer.com/index.php)。這顯然很清楚,因爲沒有除Referer頭之外的鏈接,鏈接和相同的URL之間沒有任何區別。

,我可以看到的唯一網站我登錄上提到www.glorygamer.com/account_home.php

會話cookie一直存在,併發送狀態(使用Live HTTP頭檢查),因此必須index.php(其中用戶名不是顯示在右上角,而是「登錄」)。

所以你應該檢查session_start()是否真的在這些文件中工作。如果session_start()之前有任何輸出(通過echo,var_dump,print,print_r或PHP塊以外的純HTML),session_start()會引發錯誤,因此請檢查是否存在posibble表達式錯誤消息。我不確定你是否可以壓制該錯誤消息,但我想你可以使用「正確的」服務器設置。

希望我的提示可以讓您進一步瞭解您的解決方案。

+0

這真的很奇怪。在我的計算機上,在我運行的任何瀏覽器中,只要我手動輸入,就會在我訪問的任何網頁的頂部看到顯示的用戶名。 我需要查看啓用錯誤消息。我從來沒有這樣做過,我不知道它是如何工作的,但我相信我必須學會實現我的目標。 感謝您的評論。 – rbusch90 2011-05-15 22:04:50

0

這不是一個問題的實際問題,但仍然很重要:

請始終將其傳遞到數據庫之前轉義任何用戶輸入的數據。 此:

$usernameSubmission = $_POST['usernameField']; 
$passwordSubmission = $_POST['passwordField']; 

$validAccount = mysql_query("SELECT * FROM userAccounts WHERE userID = '$usernameSubmission' AND userPassword = '$passwordSubmission'"); 

應改爲:

// Any data entered by a third party is insecure 
$usernameInsec = $_POST['usernameField']; 
$passwordInsec = $_POST['passwordField']; 

// Protect your SQL statements 
$validAccount = mysql_query(
       "SELECT * FROM userAccounts " 
       . " WHERE userID = '" . mysql_escape_string($usernameInsec) . "' " 
       . " AND userPassword = '" . mysql_escape_string($passwordInsec) 
       . "'" 
      ); 
+0

謝謝,我最近偶然發現了有關SQL注入的信息,並看到了這一點。在給予任何用戶帳戶之前,我計劃將它與密碼進行加密。絕對重要。 – rbusch90 2011-05-16 02:35:58

+0

注射是一個重要的問題。諸如「和」之類的字符串結尾標記以及諸如「或」之類的SQL關鍵字以及諸如「或1 = 1」之類的評估爲真的布爾邏輯是一種簡單而危險的攻擊方法。 com/sql/sql_injection.asp – Edward 2016-04-04 13:34:46

0

This comment上php.net聽起來像一個類似的情況,你是我的唯一,雖然我不知道爲什麼session_write_close會導致你遇到的問題。

而不是取而代之的是session_regenerate_id()作爲評論建議,我建議你只需刪除session_write_close()看看這是否結果。

+0

謝謝你的建議,但唯一帶頭調用的地方就是我上面列出的腳本,它已經調用了session_write_close(),其他所有實例都只是html鏈接,而不是php。 我最近添加了session_write_close(),因爲它在第一次嘗試中似乎沒有正確登錄,並且這個問題解決了這個問題,但剩下的問題是在網站上的其他頁面上調用會話 – rbusch90 2011-05-15 23:31:15

+0

有意思的是,你可以在你的編輯器中檢查你的頁面,看看在文件開始時是否寫了一個字節順序標記嗎?這在編輯器中通常是不可見的,但PHP會將其解釋爲腳本開始處的幾個字符和'session_start()'之前的任何輸出將阻止會話啓動。這可以在你的'session_start()'調用之前包含的任何腳本中。 – CVM 2011-05-15 23:38:14

+0

太好了。我該如何檢查? (我之前沒有聽說過一個字節順序標記) – rbusch90 2011-05-16 02:36:36

相關問題