setcookie()不工作在if语句
问题描述:
我正在设计一个登录系统作为一个个人项目,我试图存储用户的电子邮件和密码哈希(我应该存储纯文本密码吗?)在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";
}
}
?>
答
由setcookie定义的cookie与其他头一起发送(必须在包括空格在内的任何输出之前发送)。我认为问题在这里。
UPDATE
我想尝试header('Location: somepage.html')
而不是setcookie
以确保它是否是罪魁祸首。
答
我应该存储明文密码呢?
NO,NEVER,NO。这将是一个主要的安全漏洞,想象一下如果你登录后我检查你的cookies,我会马上得到你的密码。
答
为什么不使用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";
}
}
?>
哪里代码的其余部分? – diagonalbatman 2011-01-09 21:49:22
偏离主题,但您确实需要在SQL语句中所有不受信任的变量周围使用mysql_real_escape_string。否则,您的代码将容易受到SQL注入攻击。 – 2011-01-09 21:50:00
你如何验证cookie的存在? – amosrivera 2011-01-09 21:51:12