переменные сеанса исчезают?

Я пытаюсь узнать больше о хешировании паролей и безопасном входе в систему и т. Д., И по этой причине я пытаюсь дублировать этот пример здесь. Я не 100% дублировал это.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я ввожу свои учетные данные, форма переходит к process_login.php скрипт, который проверяет пароль и так далее, и устанавливает $_SESSION переменные. В случае успеха, он должен перенаправить на protected.php, сайт, который доступен только когда пользователь вошел в систему.

Для меня это не работает просто потому, что $_SESSION переменные исчезают!

Я нахожусь в точке, где process_login.php сценарий показывает мне, что $_SESSION установлен, а потом использую header("Location: protected.php"); который тогда говорит мне $_SESSION массив пуст. Как это возможно? Я скучаю по лодке здесь …

Вот части кода, которые имеют отношение:

process_login.php

process_login.php

include_once 'connect.php';
include_once 'functions.php';
sec_session_start();

if (isset($_POST['eml'], $_POST['h'])) {
$email = $_POST['eml'];
$pwd_hash = $_POST['h'];
if (login($email, $pwd_hash, $mysqli) == true) {
// in my situation, this returns true
// and the redirect to "protected.php" happens
header('Location: protected.php');
} else {
header("Location: error?err=Wrong password");
}
} else {
exit('Invalid Request');
}

login() функция

function login($email, $password, $mysqli) {
if ($stmt = $mysqli->prepare("SELECT id, email, pwd, salt FROM public WHERE email=? LIMIT 1")) {
$stmt->bind_param('s', $email);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($user_id, $email, $db_password, $salt);
$stmt->fetch();
$password = crypt($password, $salt);
if ($stmt->num_rows == 1) {
if (checkbrute($user_id, $mysqli) == true) {
// Account is locked
$status = "3";
$mysqli->query("INSERT INTO login_activity(user, status, ip)
VALUES ('$email', '$status', '{$_SERVER['REMOTE_ADDR']}')");
sleep(8);
header("Location: ../error?err=The account you try to access is currently blocked.");
return false;
} else {
// Check if the password in the database matches
// the password the user submitted.
if ($db_password == $password) {
// Password is correct!
// Get the user-agent string of the user.
$user_browser = $_SERVER['HTTP_USER_AGENT'];
// XSS protection as we might print this value
$user_id = preg_replace("/[^0-9]+/", "", $user_id);
$_SESSION['user_id'] = $user_id;
$_SESSION['login_string'] = hash('sha512', $password . $user_browser);
$status = "1";
$mysqli->query("INSERT INTO login_activity (user, status, ip)
VALUES ('{$_SESSION['user_id']}', '$status', '{$_SERVER['REMOTE_ADDR']}')");
return true;
} else {
// Password is not correct
// We record this attempt in the database
$status = "2";
$mysqli->query("INSERT INTO login_activity(user, status, ip)
VALUES ('$email', '$status', '{$_SERVER['REMOTE_ADDR']}')");
sleep(3);
header("Location: ../error?err=Password is not correct.");
return false;
}
}
} else {
// No user exists.
sleep(2);
header("Location: ../error?err=No user exists.");
return false;
}
header("Location: ../error?err=You can't see this.");
return false;
} else {
header("Location: ../error?err=DB fail: ".$mysqli->error);
return false;
}
}

protected.php

protected.php

<?php
include_once 'connect.php';
include_once 'functions.php';
sec_session_start();
// $return = login_check($mysqli);
print_r(get_defined_vars());
// this outputs an empty $_SESSION array
exit;

функция sec_session_start ()

function sec_session_start() {
$session_name = 'sec_session_id';
$secure = true;
$httponly = true;
if (ini_set('session.use_only_cookies', 1) === FALSE) {
header("Location: ../error?err=Could not initiate a safe session (ini_set)");
exit();
}
$cookieParams = session_get_cookie_params();
session_set_cookie_params($cookieParams["lifetime"],
$cookieParams["path"],
$cookieParams["domain"],
$secure,
$httponly);
session_name($session_name);
session_start();
session_regenerate_id();
}

Я пытался увидеть, что произойдет, если я просто начну сеанс, используя sec_session_start() и следующий результат:

include_once 'connect.php';
include_once 'functions.php';
sec_session_start();
$_SESSION["test"] = "works!";
header('Location: protected.php');

Выход из print_r(get_defined_vars()); в protected.php является:

[_SESSION] => Array ( )

0

Решение

Это может помочь во многих вопросах сессии. Я использовал PHP в течение многих лет и люблю его,
но это странно!

В этом коде —

page1.php

<?phpsession_start();?>

<?php
$_SESSION['roman']="kitty";
echo ('<a href="page2.php"> Go To Page 2</a>');
?>

page2.php

<?php session_start();?>

<?php
echo $_SESSION['roman'];
?>

Обратите внимание на отсутствие места в phpsession_start () на странице 1,
но я использовал пробел в php session_start () на странице 2.

Использование пространства НЕТ на странице 2, и переменные сеанса исчезли. С пробелом все работает нормально.
На странице 1 это не имеет значения, работает в любом случае с пробелом и без него. У меня есть другие сценарии, где
это наоборот. Работать будет только БЕЗ пространства! Так что стоит попробовать и проверить.

Теперь многие могут вставить этот код и заставить его работать, или не работать, как я описал, но именно поэтому
это странно!

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]