Php setcookie()在if语句中不起作用
我正在设计一个作为个人项目的登录系统,我正在尝试将用户的电子邮件和密码散列存储在cookies中(我应该存储纯文本密码吗?),以便站点知道用户登录的帐户 问题是,只要我把我的setcookie()放进去;如果在if语句中使用命令,它们将停止工作。我知道if语句正在被访问,因为它内部正在调用其他代码,但这就好像setcookie()被忽略一样 代码如下:Php setcookie()在if语句中不起作用,php,cookies,Php,Cookies,我正在设计一个作为个人项目的登录系统,我正在尝试将用户的电子邮件和密码散列存储在cookies中(我应该存储纯文本密码吗?),以便站点知道用户登录的帐户 问题是,只要我把我的setcookie()放进去;如果在if语句中使用命令,它们将停止工作。我知道if语句正在被访问,因为它内部正在调用其他代码,但这就好像setcookie()被忽略一样 代码如下: <?php $email = $_POST[email]; $password = $_POST[password]; $passwo
<?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";
}
}
?>
我应该存储纯文本密码吗?
不,从不,不。这将是一个主要的安全漏洞,假设我使用你的计算机一分钟,如果你登录,我检查你的cookie,我会立即得到你的密码。setcookie定义的cookie与其他头一起发送(必须在任何输出之前发送,包括空格)。我认为问题就在这里。
更新
我会尝试header('Location:somepage.html')
而不是setcookie
,以确定它是否是罪魁祸首。为什么您不使用PHP的会话函数向用户发送会话ID而不是登录凭据?此外,您的代码还存在多个问题:
$\u POST[email]
如果不存在固定的“email”,将抛出警告。你的意思可能是$\u 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";
}
}
?>
代码的其余部分在哪里?脱离主题,但您确实需要在SQL语句中的所有不可信变量周围使用mysql\u real\u escape\u字符串。否则,您的代码将容易受到SQL注入攻击。如何验证Cookie的存在?+1-这是一种非常糟糕的做法。事实上,即使是加密密码也不应该发送给用户。我印象深刻。在将代码发布到这里之前,我编辑了一些使代码混乱的echo语句。事实证明,这就是我需要做的来解决这个问题。然而,即使我不忠实地复制了引起问题的原始代码,你还是设法解决了这个问题。:)我过去也遇到过类似的问题。