Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php setcookie()在if语句中不起作用_Php_Cookies - Fatal编程技术网

Php setcookie()在if语句中不起作用

Php setcookie()在if语句中不起作用,php,cookies,Php,Cookies,我正在设计一个作为个人项目的登录系统,我正在尝试将用户的电子邮件和密码散列存储在cookies中(我应该存储纯文本密码吗?),以便站点知道用户登录的帐户 问题是,只要我把我的setcookie()放进去;如果在if语句中使用命令,它们将停止工作。我知道if语句正在被访问,因为它内部正在调用其他代码,但这就好像setcookie()被忽略一样 代码如下: <?php $email = $_POST[email]; $password = $_POST[password]; $passwo

我正在设计一个作为个人项目的登录系统,我正在尝试将用户的电子邮件和密码散列存储在cookies中(我应该存储纯文本密码吗?),以便站点知道用户登录的帐户

问题是,只要我把我的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";
    }
}



?>

我应该存储纯文本密码吗?


不,从不,不。这将是一个主要的安全漏洞,假设我使用你的计算机一分钟,如果你登录,我检查你的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语句。事实证明,这就是我需要做的来解决这个问题。然而,即使我不忠实地复制了引起问题的原始代码,你还是设法解决了这个问题。:)我过去也遇到过类似的问题。