Есть ли проблема с функцией setcookie() в этом коде?

#php

#php

Вопрос:

the DB.php функция работает. Единственная проблема в том, что файл cookie не устанавливается. Есть ли что-то неправильное в том, что $ token вводится в setcookie? (после ‘/’ я ставлю свой .mydomain.com вместо null .)

Примечание: (.mydomain.com это просто заполнитель, у меня там есть мой фактический домен.)

Код взят отсюда:https://github.com/howCodeORG/Social-Network/blob/Part5/login.php

Я пытался:

  • Удаление инструкции echo (она не будет загружаться без инструкции echo).
  • изменение $token = bin2hex(openssl_random_pseudo_bytes(64, $ cstrong)); на $token = bin2hex(random_bytes(64, $ cstrong)); (файл cookie по-прежнему не установлен)
  • Я использовал пример из w3schools для тестирования и затем установил cookie (следовательно, это не мой браузер).
 <?php
include('classes/DB.php');
if (isset($_POST['login'])) {
        $username = $_POST['username'];
        $password = $_POST['password'];
        if (DB::query('SELECT username FROM users WHERE username=:username', array(':username'=>$username))) {
                if (password_verify($password, DB::query('SELECT password FROM users WHERE username=:username', array(':username'=>$username))[0]['password'])) {
                        echo 'Logged in!';
                        $cstrong = True;
                        $token = bin2hex(openssl_random_pseudo_bytes(64, $cstrong));
                        $user_id = DB::query('SELECT id FROM users WHERE username=:username', array(':username'=>$username))[0]['id'];
                        DB::query('INSERT INTO login_tokens VALUES ('', :token, :user_id)', array(':token'=>sha1($token), ':user_id'=>$user_id));
                        setcookie("SNID", $token, time()   60 * 60 * 24 * 7, '/', .mydomain.com, TRUE, TRUE);
                } else {
                        echo 'Incorrect Password!';
                }
        } else {
                echo 'User not registered!';
        }
}
?>
<h1>Login to your account</h1>
<form action="login.php" method="post">
<input type="text" name="username" value="" placeholder="Username ..."><p />
<input type="password" name="password" value="" placeholder="Password ..."><p />
<input type="submit" name="login" value="Login">
</form>
  

Комментарии:

1. Вы включили error_reporting? Проверено на наличие фактического HTTP-ответа ( wget -S etc)? Вы убедились, что токен сохранен в вашей базе данных, или достигнут этот путь к коду? // Также, вероятно, следует уменьшить количество запросов к базе данных (не повторяйте это для имени пользователя и пароля дважды.)

2. Как вы проверяете наличие cookie?

3. Я использую phMyAdmin и не вижу ошибок. Токен действительно сохраняется в базе данных. Я следую руководству и не знаю, как уменьшить количество запросов к базе данных.

4. Это руководство youtube.com/watch?v=uyC0KKF-3CM в соответствии с этим вы проверяете, был ли установлен файл cookie через ваш браузер. Она используется для сохранения входа пользователя в систему.

Ответ №1:

setcookie должно происходить перед любым выводом из вашего скрипта, поскольку он полагается на отправку заголовка для установки cookie. Из руководства:

Как и другие заголовки, файлы cookie должны быть отправлены перед любым выводом из вашего скрипта (это ограничение протокола). Это требует, чтобы вы размещали вызовы этой функции перед любым выводом, включая теги <html> и <head>, а также любые пробелы.

В вашем коде у вас есть echo 'Logged in!'; перед вашим вызовом setcookie , что помешает его работе.

Комментарии:

1. Я переместил оператор echo так, чтобы он выполнялся после установки файла cookie. файл cookie по-прежнему не устанавливается.

2. Кажется, у вас опечатка в вызове, .mydomain.com должно быть в кавычках (также в начале не должно быть . . Также, если вы не используете SSL, secure параметр должен быть false , не true

3. Теперь я включил кавычки и использую SSL. Почему бы мне не использовать . перед mydomain.com ?

4. . Больше не требуется в современных браузерах.

5. Спасибо. нужно ли устанавливать cookies вне операторов if?