.htaccess — PHP $ _SESSION иногда работает, иногда нет

Добрый день,

У меня есть небольшая, но не менее важная проблема.
Создан класс SESSION, и в целом он работает просто отлично.

Однако по некоторым странным причинам время от времени он начинает извращаться и генерирует индивидуальный sessionID для каждой отдельной страницы / папки.

Ситуация следующая.

Я использую класс Session в моей собственной среде.
Моя структура использует маршрутизацию на основе структуры каталогов.

Такие как:

Я делаю это от руки .Htaccess файл.

<IfModule mod_rewrite.c>
RewriteEngine           on
RewriteRule             ^$    core/    [L]

# If the request is not for a valid directory
RewriteCond %{REQUEST_FILENAME} !-d
# If the request is not for a valid file
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule    (.*) core/$1    [L]
</IfModule>

Я пытаюсь направить весь трафик к файлу в папке /core/index.php
Здесь я загружаю все свои модули и мой сессионный класс.

Проблема

В целом работает нормально. НО на регулярной основе (время от времени), когда
Я вхожу в систему, перенаправляет пользователя со страницы входа на стартовую страницу.
Там он обнаруживает, что пользователь не вошел в систему и пересылает его
вернуться на страницу входа.

Итак, у вас есть один домен. Но несколько папок, в которых система генерирует несколько идентификаторов сессии.

# 1 Пользователь входит в систему под:

http://domain.com/login/

1 сессионный ID сгенерирован
2 Проверка входа
3 Пользователь получает данные для входа
зарегистрированных
4 Пользователь перенаправляется на следующую страницу

# 2 Пользователь прибывает в:

http://domain.com/start/
1 идентификатор сессии ДОЛЖЕН поддерживаться. НО
получает по какой-то причине регенерацию
2 Пользователь не может пройти проверку подлинности и
пересылается на предыдущую страницу

# 3 Пользователь достигает:

http://domain.com/login/
Найден 1 исходный идентификатор сеанса
2 пользователя
аутентифицируется с данными, хранящимися в сеансе, и переходит к следующему
страница

# 4 Пользователь возвращается на стартовую страницу и снова находит другой идентификатор сессии … и т. Д. И т. Д.

Я использую следующие настройки перед началом сеанса:

ini_set('session.cookie_lifetime',      432000);
///ini_set('session.cookie_path',           false); /// Disabled this option because this should be causing this issue. But to no avail unfortunately.
ini_set('session.cookie_domain',        'domain.com');
ini_set('session.cookie_secure',        false);
ini_set('session.cookie_httponly',      true);

ini_set('session.gc_probability',       0);

Интересно, где я мог ошибиться?
Сессионный класс намного больше, конечно. Но я думаю, что было бы слишком большим, чтобы опубликовать его целиком.
Если какие-то вопросы по конкретной части задайте, я опубликую это.

Надеюсь, что кто-то может увидеть мою ошибку.
Заранее спасибо!

На данный момент я решаю эту проблему, удаляя все куки домена сессии.
Тогда я загружаю http://domain.com/login/ снова и войдите и все снова работает нормально. Но через пару дней проблема возникает снова.

Содержание сеанса ФАЙЛ:

SessionIPaddress|s:9:"127.0.0.1";SessionuserAgent|s:72:"Mozilla/5.0 (Windows NT 6.3; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0";Parking_loggedin|b:1;Parking_user|s:1:"1";Parking_level|s:1:"1";

Ссылка на файл на gitHub

https://github.com/alexhakkenberg/https—github.com-alexhakkenberg-sessionclass/blob/master/session.class.php

2

Решение

Некоторые проблемы

Масса комментариев делает код не более, но менее читабельным. Без всех комментариев размер файла составляет всего ~ 350 строк вместо 714. Проще понять общее назначение более короткого файла. Множество комментариев также просто переписывают код, они даже не полезны. Например return(false) говорит сам за себя и не должен быть аннотирован.

Вы дублируете функциональность PHP, особенно в отношении обработки файлов cookie. Это уже сделано PHP.

Вы создаете файл в WriteSession, который не содержит данных сеанса и, таким образом, немного вводит в заблуждение. (Данные сеанса фактически не сохраняются основными функциями PHP.) Файл содержит только некоторые данные для проверки сеанса, возможно, для предотвращения взлома, но он явно не используется для предотвращения угона. Взлом предотвращается проверкой данных, хранящихся в сеансе (правильный путь!), Поэтому дополнительный файл не требуется. (Обратите внимание, что некоторые агенты переключают IP во время просмотра вашего сайта, поэтому проверка полного IPv4 может раздражать этих посетителей.)

Некоторые советы

  • Вы смешиваете слой абстракции с массивом сессии (__get / __set) с кодом хранения. Обязательно разделите эти два аспекта, по крайней мере, в своем уме или даже разделите их на два класса.
    • Слой абстракции должен содержать все вокруг session_startнапример, предотвращение взлома, уничтожение сеанса, … и не должно записывать / извлекать какие-либо данные. Это должно быть основано исключительно на $_SESSION,
    • Уровень хранения должен выполнять ровно одну задачу: запись и получение $_SESSION,
  • Если вы абсолютно не уверены, чего хотите достичь, просто используйте пользовательские функции PHP для хранения / извлечения данных сеанса. Если вы по какой-либо причине хотите изменить способ хранения данных, используйте соответствующие методы PHP для этого. Возможный вариант использования для сохранения сеанса в базе данных, чтобы иметь возможность легко работать с данными.
  • Перепроверьте документацию или учебник по PHP-сессиям о том, что PHP уже предоставляет для вас. Не изобретай колесо снова.
  • Пофиг на домен. В реальном мире вы, вероятно, никогда не столкнетесь с проблемами запутанных сеансов в разных доменах. (Поскольку папки хранения для сеанса будут установлены в разных местах для разных рутов.)
  • В прошлый раз, когда я их видел, методы отражения предназначались только для «специальных целей». Обойти программистов нужно просто записать переменные не может быть таким «особым случаем».
2

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

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

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