Я пытаюсь узнать больше о хешировании паролей и безопасном входе в систему и т. Д., И по этой причине я пытаюсь дублировать этот пример здесь. Я не 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 ( )
Это может помочь во многих вопросах сессии. Я использовал 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 это не имеет значения, работает в любом случае с пробелом и без него. У меня есть другие сценарии, где
это наоборот. Работать будет только БЕЗ пространства! Так что стоит попробовать и проверить.
Теперь многие могут вставить этот код и заставить его работать, или не работать, как я описал, но именно поэтому
это странно!
Других решений пока нет …