Как установить куки во время авторизации?
У меня есть форма авторизации, на страничке в самом начале выводится хедер, стандартный, как на всех остальных страницах. В хедер подключается файл конфига, сео и проверка на наличие этих кук, что не даёт сделать setcookie на странице авторизации под формой. Как устанавливать куки если перед этим нужно вывести хедер и кучу другой информации?
Вот страница логина:
<?php
require_once "blocks/header.php";
?>
<div style="padding-bottom: 10px;"><h1>Вход</h1></div>
<div class="addform">
<form method="POST" action="login.php" enctype="multipart/form-data">
<span class="input-group-prepend">Логин</span>
<input type="text" class="form-control" name="login" required>
<span class="input-group-prepend">Пароль</span>
<input type="text" class="form-control" name="password" required>
<input type="hidden" id="g-recaptcha-response" name="g-recaptcha-response" />
<span class="note">Protected by Google captcha</br></span>
</br><span class="input-group-prepend"><input name='remember' type='checkbox' value="1"> Запомнить меня</br></span>
</br>
<input type="submit" name="submit" value="Войти" class="btn btn-success">
</form>
</div>
<?
if ($_SESSION['login'] == true) {
echo '<META HTTP-EQUIV="Refresh" CONTENT="0; URL=profile.php">';
exit;
} else {
/*КЛЮЧИ*/
define('SITE_KEY', '..........');
define('SECRET_KEY', '.............');
/*ОБРАБОТКА ЗАПРОСА*/
if($_POST){
/*СОЗДАЕМ ФУНКЦИЮ КОТОРАЯ ДЕЛАЕТ ЗАПРОС НА GOOGLE СЕРВИС*/
function getCaptcha($SecretKey) {
$Response = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".SECRET_KEY."&response={$SecretKey}");
$Return = json_decode($Response);
return $Return;
}
/*ПРОИЗВОДИМ ЗАПРОС НА GOOGLE СЕРВИС И ЗАПИСЫВАЕМ ОТВЕТ*/
$Return = getCaptcha($_POST['g-recaptcha-response']);
/*ВЫВОДИМ НА ЭКРАН ПОЛУЧЕННЫЙ ОТВЕТ*/
//var_dump($Return);
/*ЕСЛИ ЗАПРОС УДАЧНО ОТПРАВЛЕН И ЗНАЧЕНИЕ score БОЛЬШЕ 0,5 ВЫПОЛНЯЕМ КОД*/
if($Return->success == true && $Return->score > 0.5){
//echo "Succes!";
$login = $_POST['login'];
$password = md5($_POST['password']);
$sql = "SELECT * FROM users WHERE login='$login'";
if($result = $conn->query($sql)){
foreach($result as $row){
$logindb = $row["login"] . $row["password"];
}
$result->free();
} else{
echo "Ошибка: " . $conn->error;
}
if ($logindb == $login . $password && $_SERVER['REQUEST_METHOD'] == 'POST') {
echo "</br>Входим...</br>";
session_start();
// инициализируем переменные сессии
$_SESSION['login'] = $login;
$date = date('Y-m-d H:i:s');
//Проверяем, что была нажата галочка 'Запомнить меня':
if ( !empty($_REQUEST['remember']) and $_REQUEST['remember'] == 1 ) {
//Сформируем случайную строку для куки:
$qkey = uniqid();
//Пишем куки (имя куки, значение, время жизни - сейчас+месяц)
setcookie('login', $login, time()+60*60*24*30); //логин
setcookie('key', $qkey, time()+60*60*24*30); //случайная строка
// добавляем qkey
$sql = "UPDATE users SET qkey = '$qkey' WHERE login='$login'";
if($conn->query($sql)){ } else { echo "Ошибка" . $conn->error; }
}
// обновляем дату входа
$sql = "UPDATE users SET visit = '$date' WHERE login='$login'";
if($conn->query($sql)){ } else { echo "Ошибка" . $conn->error; }
// переходим в профиль
echo '<META HTTP-EQUIV="Refresh" CONTENT="0; URL=profile.php">';
} else if($_SERVER['REQUEST_METHOD'] == 'POST') {
echo "</br>Что-то не так.";
sleep(1);
}
}
else {
echo "You are Robot";
sleep(2);
}
}
}
?>
<script src="https://www.google.com/recaptcha/api.js?render=<?php echo SITE_KEY?>"></script>
<script>
grecaptcha.ready(function() {
grecaptcha.execute('<?php echo SITE_KEY;?>', {action: 'homepage'}).then(function(token) {
//console.log(token);
document.getElementById('g-recaptcha-response').value=token;
});
});
</script>
<?php require_once "blocks/footer.php"; ?>
Вот начало хедера:
<?php
session_cache_limiter('private_no_expire'); // works
header('Last-Modified: ' . gmdate("D, d M Y H:i:s") . ' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
header('Pragma: no-cache');
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
include "config.php";// подключение к базе
include "seo.php"; //SEO
if ( !empty($_COOKIE['login']) and !empty($_COOKIE['key']) ) {
//Пишем логин и ключ из КУК в переменные (для удобства работы):
//echo 'yes';
$loginq = $_COOKIE['login'];
$keyq = $_COOKIE['key'];
//определение данных залогиненого из бд
$conn = mysqli_connect($servername, $username, $password, $database);
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
$sql = "SELECT * FROM users WHERE login='$loginq'";
if($result = $conn->query($sql)){ foreach($result as $row){
$dbkeys = $row["login"] . $row["qkey"];
} $result->free(); }
//проверяем совпадение
if ($dbkeys == $loginq . $keyq) {
session_start();
//Пишем в сессию логин и id пользователя (их мы берем из переменной $user!):
$_SESSION['login'] = $loginq;
} else{
session_start();// запускаем сессию
}
}
.............
Ошибка: Warning: Cannot modify header information - headers already sent
Ответы (1 шт):
header.php:
<?php
session_cache_limiter('private_no_expire'); // works
header('Last-Modified: ' . gmdate("D, d M Y H:i:s") . ' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
header('Pragma: no-cache');
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
//Это единственное место где нужно вызывать данную команду, больше нигде не нужно, если у вас подключен хидер"
session_start();
.....
p.s. Далее по коду:
$_COOKIE['login'];
Никогда, НИКОГДА, не делайте так. нельзя в куках хранить логин и пароль. в сессии - пожалуйста, в куках - никогда.
Передали на сервер данные авторизации, проверили все, и сохранили в массив $_SESSION необходимые вам данные.
Ну и судя по всему вы путаете куки и сессии, это разные вещи...
$loginq = $_COOKIE['login'];
$_SESSION['login'] = $loginq;
Вот примерный код который вам нужно реализовать:
<?php
session_start();
if(!isset($_SESSION['userid']) && !isset($_POST['login'])){
// Здесь пользователь не авторизован и не прислал логин
} elseif(!isset($_SESSION['userid']) && (
isset($_POST['login']) || isset[$_COOKIE[{LongTimeAuthData}]])){
//Пользователь всё еще не авторизован, но хочет это сделать
//нужно проверить что пользователь существует в БД и положить его идентификатор в $_SESSION['userid']
//создать куку с нужными переменными для дительного хранения сесси, и возобновления ее
} elseif(isset($_SESSION['userid'])){
//пользователь авторизован, его id => $_SESSION['userid']
}
Обратите внимание в примере - заголовочный файл(т.е. файл который подключается во все скрипты где нужно знать авторизован пользователь или нет)