setcookie () не работает в операторе if - PullRequest
1 голос
/ 10 января 2011

Я разрабатываю систему входа в систему как личный проект и пытаюсь сохранить электронную почту и хэш пароля пользователя (лучше ли хранить простой текстовый пароль?) В файлах cookie, чтобы сайт знал, какую учетную запись пользователя авторизован.

Беда в том, как только я положил мой 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";
    }
}



?>

Ответы [ 3 ]

1 голос
/ 10 января 2011

Cookie, определенный setcookie, отправляется вместе с другими заголовками (которые должны быть отправлены перед любым выводом, включая пробелы).Я думаю, что проблема здесь.
ОБНОВЛЕНИЕ
Я бы попробовал header('Location: somepage.html') вместо setcookie, чтобы убедиться, что это виновник.

1 голос
/ 10 января 2011

стоит ли вместо этого сохранять пароль в виде простого текста?

НЕТ, НИКОГДА, НЕТ. Это было бы серьезным недостатком безопасности, представьте, что я использую ваш компьютер длячерез минуту, если вы вошли в систему и я проверю ваши куки, у меня будет ваш пароль мгновенно.

0 голосов
/ 10 января 2011

Почему вы не используете функции сеанса PHP, чтобы просто отправить пользователю идентификатор сеанса вместо его учетных данных для входа?Кроме того, ваш код страдает от нескольких проблем:

  • $_POST[email] выдает предупреждение, если не существует постоянного «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";
   }
}

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...