2011-05-14 4 views
1

방금 ​​PHP를 배우기 시작했고, 내 웹 사이트에 PHP와 MySQL을 사용하여 계정 시스템을 작성했습니다. 나는 SQL 물건이 잘 작동하는 것을 알고, 문제는 내 PHP 세션입니다.내 세션 기반 로그인 시스템이 작동하지 않는 이유는 무엇입니까?

테스트 할 때 로그인을 시도 할 수 있으며 실패합니다. 그런 다음 다시 로그인을 시도하면 성공합니다. 그것은 항상 두 번째 로그인 시도에 성공합니다. 파이어 폭스의 첫 번째 시도에서는 성공하지 못했지만 크롬에서는 성공했다. 또한 Chrome에서 몇 번 로그인 한 후 내 사이트의 일부 다른 페이지로 이동하여 세션을 지우는 것처럼 보였습니다. 또는 적어도 그 세션이 다른 페이지에 등록되지 않았습니다. 나는 Firefox에서 그 문제가 없었다. 나는 체크하고, 더블 체크하고, 트리플 체크하고, 모든 페이지는 다른 것보다 먼저 session_start()를 호출하므로 문제가 될 수 없다.

PHP 세션에 대해 충분히 이해하지 못했습니다. 일관되게 작동하지 않기 때문에 말입니다.

게시 후, 나는 IE에서 테스트하고 모든 것이 잘 작동합니다. 첫 번째 시도에서 로그인하면 내가 방문한 페이지가 내 세션을 유지 관리합니다.

<?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

+0

문제를 도와 드릴 수 있도록 샘플 코드를 게시하십시오. – Prix

+0

고맙습니다. 내가 코드없이 설명했다면 명백한 알려진 문제가 있는지 확실하지 않았다. 나는 원래의 질문에 코드를 포함시켰다. – rbusch90

답변

1

내가 볼 첫 번째 것은 작은 따옴표의 부족입니다 : 여기

는 사용자 실제로 "에서 로그"는 PHP 스크립트 코드입니다. 또한 아무도 당신에게 SQL 주입을 할 수 없도록 확실히 이스케이프해야합니다.

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

는해야한다 : 세션이 간헐적으로 작동하고

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

이것은 분명히이 문제의 원인이 아닙니다. – Gumbo

+0

이것은 내 문제를 해결하지 못했지만 보안에 구멍을내어 패치하는 것은 아주 귀중합니다. 도움을 주셔서 감사합니다. – rbusch90

+0

@Gumbo 시작입니다. – Flipper

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

    +0

    각 페이지의 어딘가에 session_write_close()를 호출해야합니까? – rbusch90

    +0

    나는 고쳐졌다. FireFox에서 두 번 로그인해야하는 문제가 해결되었습니다 ... Chrome에는 여전히이 문제가 있습니다. 또한, 내가 "내 세션을 끝내라"는 내 사이트로 이동하는 페이지가 항상 그렇게하지는 않습니다. 간헐적으로 발생하는 것 같습니다. – rbusch90

    관련 문제