2012-05-12 41 views
0

對不起的標題...PHP格式/餅乾,需要刷新頁面才能看到變化

我想寫一個登錄腳本的基本形式。用戶輸入用戶名和密碼並按下「登錄」。分配給表單的操作只是刷新同一頁面。該頁面的代碼檢查$ _POST中的用戶名和密碼,如果他們在那裏,則檢查憑據,創建會話ID並設置cookie。如果登錄成功,則不應再顯示頁面的登錄部分。

我遇到的問題是,在我登錄後,似乎cookie沒有被寫得足夠快或什麼東西,因爲隨後從該cookie讀取失敗。如果我手動刷新我的網頁立即但是,它實際上已經登錄成功。

// Login function, MD5 hashing would be replaced with something better 
// if this were something mission critical, but as it stands I'm only 
// using this as a learning tool 
function login($username, $password) 
{ 

    $username = addslashes($username); 
    $password = md5($password); 
    $query = mysql_query("SELECT * FROM users WHERE username='$username' AND password='$password'"); 

    if(mysql_num_rows($query) == 1) 
    { 
     $info = mysql_fetch_array($query); 
     $userid = $info[uid]; 
     $sessionid = md5($userid . time()); 
     $time = time(); 
     setcookie ("testcookie", $sessionid, $time+3600, '/', ''); 
     mysql_query("DELETE FROM sessions WHERE uid='$userid'"); 
     mysql_query("INSERT INTO sessions (sessionid,uid,timestamp) VALUES('$sessionid','$userid','$time')"); 
     return $userid; 
    } 
    else 
    { 
     return 0; 
    } 
} 







// Check the cookie and return the userid 

function status() 
    { 

     $sessionid = $_COOKIE[nojunkcontest]; 
     $oldtime = time() - 3600; 
     $query = mysql_query("SELECT * FROM sessions WHERE sessionid='$sessionid' AND timestamp>$oldtime"); 


     if(mysql_num_rows($query) == 1) 
     { 
      $info = mysql_fetch_array($query); 
      return $info[uid]; 
     } 

     return 0; 
    } 





// Check whether to attempt login, get userid either way 

if($_POST[username] !='' || $_POST[password] != '') 
{ 
    $login_status = login($_POST[username], $_POST[password]); 
} 

else if($_GET[logout]) 
{ 
    logout(); 
} 

unset($userid); 
$userid = status(); 





// This is in the body of the document... 

<?php 
if($userid > 0) 
{ 
echo "Logged in (<a href='?logout=1'>Logout</a>)"; 
} 

else 
{ 

if($login_status != '' && $login_status == 0) 
{ 
    echo "Invalid username/password combo.<br>"; 
} 

?> 

<form action = 'index.php' method ='post'> 
<table border = '0' cellspacing = '5'> 
<tr> 
    <td>Username</td> 
    <td><input type = 'text' name = 'username'></td> 

    <td>Password</td> 
    <td><input type = 'password' name = 'password'></td> 

    <td><input type = 'submit' name = 'submit' value = 'Login'></td> 
</tr> 
</table> 
</form> 

正如你可以看到,表單動作「的index.php」,這是同一個頁面,所有這些代碼所在,所以它只是執行刷新。儘管如此,status()函數在此刷新上返回0,但如果以後手動刷新,它會成功,這導致我相信這是失敗的$ _COOKIE調用。我不包括的login()函數寫入status()讀取的cookie。所以一切都在這個部門工作,這只是我無法弄清楚的令人討厭的更新事物。

任何幫助,將不勝感激,謝謝。

+0

login()函數是什麼樣的? – Danny

+0

腳本不安全:不要使用會話ID進行檢查登錄或不會。我建議使用訪客IP創建一個散列並將其插入到會話表中。在這一行if($ _ POST [username]!=''|| $ _POST [password]!='')您必須替換||用&&​​和:替換if($ login_status!=''&& login_status == 0)if($ login_status == 0) –

+1

Cookie值可以被用戶操縱,所以**這段代碼很容易被SQL注入。 **你真的應該使用準備好的語句,把你的變量作爲參數傳遞給你,這些參數不會被SQL評估。如果你不知道我在說什麼,或者如何解決它,請閱讀[Bobby Tables](http://bobby-tables.com)的故事。 – eggyal

回答

0

正如你說,你只是在試驗階段,因此並不一定是安全的:

的問題與您的Cookie是一個cookie設置執行並交付給用戶完成。這就是爲什麼在將它設置在同一個腳本中後,您無法讀取幾行內容的原因。

但是,正如其他人在評論中已經建議的那樣,千萬不要使用cookie來使用會話。

+0

謝謝你,這是完美的感覺,我很感激! – ARW

相關問題