2011-01-09 161 views
1

我正在設計一個登錄系統作爲一個個人項目,我試圖存儲用戶的電子郵件和密碼哈希(我應該存儲純文本密碼嗎?)在cookie中以便該網站知道用戶登錄的帳戶。setcookie()不工作在if語句

問題是,只要我把我的setcookie();在if語句中的命令,他們停止工作。我知道if語句正在被達到,因爲其中的代碼是從其中調用的,但它就好像setcookie()被忽略了一樣。

下面的代碼:

<?php 

$email = $_POST[email]; 
$password = $_POST[password]; 

$passwordHash = sha1($password); 



$dbhost = "localhost"; 
$dbuser = "user"; 
$dbpass = "password"; 
$dbname = "db"; 


mysql_connect($dbhost,$dbuser,$dbpass) 
or die("Error: Failed to connect to database"); 

mysql_select_db($dbname) 
or die("Error: Failed to select databse"); 

$query = "SELECT * FROM users WHERE user = '$email'"; 
$sql = mysql_query($query); 

while($r = mysql_fetch_array($sql)) { 


    if($passwordHash == $r[passwordhash]) { 


     setcookie("Email", $email, time()+3600); 
     setcookie("PasswordHash", $passwordHash, time()+3600); 


     echo "added cookie"; 

    } 
    else { 
     echo "Incorrect password"; 
    } 
} 



?> 
+0

哪裏代碼的其餘部分? – diagonalbatman 2011-01-09 21:49:22

+2

偏離主題,但您確實需要在SQL語句中所有不受信任的變量周圍使用mysql_real_escape_string。否則,您的代碼將容易受到SQL注入攻擊。 – 2011-01-09 21:50:00

+0

你如何驗證cookie的存在? – amosrivera 2011-01-09 21:51:12

回答

1

由setcookie定義的cookie與其他頭一起發送(必須在包括空格在內的任何輸出之前發送)。我認爲問題在這裏。
UPDATE
我想嘗試header('Location: somepage.html')而不是setcookie以確保它是否是罪魁禍首。

1

我應該存儲明文密碼呢?

NO,NEVER,NO。這將是一個主要的安全漏洞,想象一下如果你登錄後我檢查你的cookies,我會馬上得到你的密碼。

0

爲什麼不使用PHP的會話功能僅僅向用戶發送會話ID而不是他們的登錄憑證?此外,您的代碼遭受多種問題:

  • $_POST[email]如果不存在常量「電子郵件」,將會發出警告。你可能意思是$_POST['email']
  • 如果關閉了magic_quotes,那麼您的SQL查詢很容易出現SQL注入。

我建議改變這樣的代碼:

<?php 

$email = isset($_POST['email']) ? $_POST['email'] : ''; 
$password = isset($_POST['password']) ? $_POST['password'] : ''; 

$passwordHash = sha1($password); 
$dbhost  = "localhost"; 
$dbuser  = "user"; 
$dbpass  = "password"; 
$dbname  = "db"; 

mysql_connect($dbhost,$dbuser,$dbpass) or die("Error: Failed to connect to database"); 
mysql_select_db($dbname) or die("Error: Failed to select databse"); 

$query = "SELECT * FROM users WHERE user = '".mysql_real_escape_string($email)."' LIMIT 1"; 
$sql = mysql_query($query); 

if (mysql_num_rows($sql) == 1) { 
    $r = mysql_fetch_array($sql); 

    if ($passwordHash == $r['passwordhash']) { 
     session_start(); 
     $_SESSION['user_id'] = $email; 
    } 
    else { 
     echo "Incorrect password"; 
    } 
} 

?>