2011-05-14 61 views
1

我剛剛開始學習PHP,併爲我的網站編寫了一個PHP和mySQL的帳戶系統。我知道SQL的東西工作正常,問題是我的PHP會話。爲什麼我的基於會話的登錄系統無效?

當我去測試它時,我可以嘗試登錄,並失敗。然後,我嘗試再次登錄,它會成功。它在第二次嘗試登錄時總是成功。它在Firefox中的第一次嘗試從來沒有成功,但它在Chrome中。此外,在Chrome成功登錄之後,在我的網站上轉到一些不同的頁面似乎擦掉了會話。或者,至少,該會議沒有在其他網頁上註冊。我在Firefox上沒有這個問題。我已經檢查過,重複檢查和三重檢查,並且我的所有頁面都先調用了session_start(),所以我知道這不是問題。

我不能對PHP會話有足夠的理解,因爲它只是不一致工作。

發佈後,我在IE中測試,並且一切工作正常。我登錄了第一次嘗試,並且我訪問的任何頁面都維護了我的會話。

下面是PHP腳本,實際上是「日誌中的」用戶代碼:

<?php 
session_start(); 
//pass info to mysql(servername, username, password) 
$connect = mysql_connect ("localhost", "ggstudio", "mtgertai1"); 
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']; 

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

處理登錄的PHP代碼將需要幫助您在這裏... – tobyodavies 2011-05-14 05:17:56

+0

發佈您的示例代碼,以便我們可以幫助您解決您的問題。 – Prix 2011-05-14 05:19:53

+0

謝謝。我不確定是否有一些明顯的已知問題,如果我在沒有代碼的情況下描述它就會明顯。我已經將代碼包含在我原來的問題中了。 – rbusch90 2011-05-14 17:08:45

回答

1

我看到的第一件事情是缺少單引號。此外,你應該肯定會逃避這些,這樣任何人都無法對你進行任何SQL注入。

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

應該是:

$usernameSubmission = mysql_real_escape_string($_POST['usernameField']); 
$passwordSubmission = mysql_real_escape_string($_POST['passwordField']); 
+0

這絕對不是這個問題的原因。 – Gumbo 2011-05-14 17:21:21

+0

這並沒有解決我的問題,但修補安全漏洞是無價的,但是。謝謝你的幫助。 – rbusch90 2011-05-14 17:28:12

+0

@Gumbo這是一個開始。 – Flipper 2011-05-14 17:30:11

2

如果會話工作間歇那麼我會說有一兩件事情發生:

  • 您的會話不被在設置瀏覽器正確
  • 您的會話沒有及時保存在服務器上。

可能發生的一件事(特別是當您在本地主機上測試時)是因爲下一個請求沒有及時寫入磁盤,因此下一個請求看起來是未驗證的(記住apache是​​多進程的;你的第二個請求可以由另一個不知道第一個進程的進程處理)。這裏是一個可能的解決方案:

$_SESSION['userRank']= $row['userRank']; 
session_write_close(); 
header('Location: http://www.glorygamer.com/account_home.php'); 

session_write_close()調用應該意味着你的身份驗證會話的時間爲下一個請求準備。

HTH。

+0

謝謝,謝謝!這解決了我第一次嘗試不登錄的問題。但是,如果我去「錯誤的頁面」,它似乎仍然會失去會話。再一次,這個頁面在同一臺服務器上,它調用session_start(),因爲它應該是...... – rbusch90 2011-05-14 17:35:22

+0

我應該在每個頁面的某處調用session_write_close()嗎? – rbusch90 2011-05-14 17:43:18

+0

我糾正了。這解決了必須在FireFox上登錄兩次的問題... Chrome有時候仍然存在這個問題。另外,我在我的網站上發佈的「結束會話」頁面並不總是這樣做。它似乎間歇性地發生。 – rbusch90 2011-05-14 17:45:28