Переменные PHP _Session теряются между файлами php.Зачем? - PullRequest
0 голосов
/ 25 ноября 2018

Я знаю, что по названию на этот вопрос здесь отвечали несколько раз, но ни одна из публикаций не предлагает мне правильного решения.Итак, я иду:

ПРОБЛЕМА:

У меня есть и файл index.php.Это базовая html-форма с полями user / password и кнопкой входа в систему.При нажатии на кнопку «Вход», функция с именем login () генерирует хэш для пароля.Затем пользователь + хэш сверяются с базой данных.Если доступ действителен, я добавляю некоторые значения в SESSION, возвращает true, а затем форма загружает php-файл с именем process_login.php, где все, что я делаю, это проверяю, является ли пользователь администратором или нет, и загружаю другую сеть в соответствии стот.Пока все хорошо.

process_login.php загружает нужный веб-сайт и может видеть значения SESSION (я пытался их напечатать, все в порядке).

Эти значения используются дляпроверьте, есть ли у текущего пользователя допустимый сеанс (залогинен) перед загрузкой любого веба.Вот как я добавляю переменные к СЕССИИ между прочим:

$user_id = preg_replace("/[^0-9]+/", "", $user_id);    
$username = preg_replace("/[^a-zA-Z0-9_\-]+/", "", $user);
$_SESSION['user_id'] = $user_id;
$_SESSION['username'] = $username;
$_SESSION['login_string'] = hash('sha512', $db_password . $user_browser);

Вот проблема: process_login.php загружает нужную сеть home.php.Затем home.php проверяет, является ли сеанс допустимым, с помощью функции login_check ().Первая строка этой функции:

 // Check if all session variables are set 
if (isset($_SESSION['user_id'], $_SESSION['username'], $_SESSION['login_string'])) {

И это не удалось.SESSION - это пустой массив, и я не знаю почему.

Читая возможные причины, люди всегда предлагают вызывать start_session () в начале каждого php-файла, где нам нужно использовать SESSION.Ну, я делаю.Я называю это в index.php, process_login.php и home.php, и все же ... ничего.Единственное место, которое я не называю, это файл functions.php, который я использую для объявления всех функций, которые я упомянул выше.это просто включенный файл, там ничего не загружается.

Вот как я начинаю сеанс:

function sec_session_start() {
 $session_name = 'sec_session_id';   // Set a custom session name 
 $secure = SECURE;

 // This stops JavaScript being able to access the session id.
 $httponly = true;

 // Forces sessions to only use cookies.
 if (ini_set('session.use_only_cookies', 1) === FALSE) {
     header("Location: ../error.php?err=Could not initiate a safe session (ini_set)");
     exit();
 }        

 // Gets current cookies params.
 $cookieParams = session_get_cookie_params();
 session_set_cookie_params($cookieParams["lifetime"],  $cookieParams["path"], $cookieParams["domain"], $secure, $httponly);

 // Sets the session name to the one set above.
 session_name($session_name);

 session_start();            // Start the PHP session 
 session_regenerate_id();    // regenerated the session, delete the old one.
}

Затем, в начале каждого файла, я устанавливаю этот фрагмент кода (код может немного отличаться, потому что файлы включения могут небыть таким же)

<?php
 include_once 'includes/db_connect.php';
 include_once 'includes/functions.php';
 sec_session_start();
?>

Как видите, в конце я вызываю session_regenerate_id ().Я подозревал, что, возможно, это удаляло все в моей СЕССИИ, поэтому я прокомментировал это.Ничего не изменилось.home.php постоянно не видит, что находится на СЕССИИ.

Любая помощь будет принята с благодарностью.Я могу предоставить больше кода, если это необходимо.Кроме того, стоит упомянуть, что это не удается как локально (XAMPP), так и онлайн (веб-хостинг).

Приветствия

ОБНОВЛЕНИЕ:

При создании сессии яиспользуя функцию session_set_cookie_params () для ее настройки.Параметр SECURE - это определенное значение bool, для которого установлено значение true.Если я изменю это на ЛОЖЬ, все работает просто отлично.Я понимаю, что XAMPP не может использовать https (если вы не установили сертификат и т. Д.), Но я ожидаю, что это будет работать на сервере (он использует защищенные соединения ssh, поэтому https).Двойная проверка перенаправлений использует https.

1 Ответ

0 голосов
/ 25 ноября 2018

Проблема решена сейчас.Я все делал правильно, по книге, как они сказали.Проблема была в следующем: я установил флаг безопасности в значение ИСТИНА при настройке параметров cookie для сеанса.Это заставляет cookie-файлы передаваться только через защищенные соединения (подробнее здесь session_set_cookie_params )

Проблема в том, что все получают доступ к веб-сайту с использованием любого www.или ничего (действительно http), и это делает куки не передаваемыми, потому что это не безопасное соединение.Но, если вы обращаетесь по протоколу https (или https://www),, все работает нормально (у меня на сервере установлен сертификат ssl). Решением было использование перенаправления в файле .htacess на сервере, чтобы все былоперенаправлен на https://www для обеспечения безопасного доступа. Я использовал этот код

RewriteEngine On
RewriteCond %{HTTPS} off
# First rewrite to HTTPS:
# Don't put www. here. If it is already there it will be included, if not
# the subsequent rule will catch it.
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Now, rewrite any request to the wrong domain to use www.
# [NC] is a case-insensitive match
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Спасибо всем за ваши советы и предложения.

Приветствия!

...