2011-01-09 162 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"; 
    } 
} 

?>