У меня есть система проверки подлинности PHP на моем сайте, используя переменную $ _SESSION.
Форма отправляет имя пользователя и пароль в файл «login.php». Он обрабатывается следующим образом:
<?php include '../includes/sessionstart.inc.php'; ?> <?php ob_start(); ?> if($_POST){ $q = mysql_query("SELECT id, company FROM users WHERE username = '".mysql_real_escape_string($_POST['username'])."' AND password = '".md5($_POST['password'])."'"); if(mysql_num_rows($q) >= 1){ $f = mysql_fetch_Array($q); $_SESSION['company'] = $f['company']; $_SESSION['id'] = $f['id']; $_SESSION['logedin'] = true; session_write_close(); ob_clean(); header("Location: index.php"); }
Затем загружается index.php и проверяется, является ли «logedin» истинным.
<?php include '../includes/sessionstart.inc.php'; ?> <?php if(!isset($_SESSION['logedin'])) header('Location: login.php'); ?>
На моем рабочем сервере он продолжается, но на моем Wampserver он возвращается обратно в login.php. Я замечаю, что Wampserver очень медленно загружает страницы, это может что-то с этим сделать. Вот почему я включил session_write_close, чтобы убедиться, что данные сеанса сохранены до переключения страниц, но это не помогает.
Содержимое session_start.inc.php просто:
<?php session_start(); ?>
Раньше у меня было больше кода, но на данный момент это именно так. Проблема также существовала до того, как я начал использовать файл include.
Кто-нибудь знает, что я делаю неправильно? Почему Wampserver не передает мои данные SESSION в следующий файл PHP?
WAMP server 2 – настройки по умолчанию не заданы для $_SESSION
var.
PHP.ini требует следующих настроек:
C:\wamp\bin\apache\apache2.4.2\bin\php.ini session.cookie_domain = session.use_cookies = 1 session.save_path = "c:\wamp\tmp" ;ensure the \ is used not /
Тестирование сеанса – load.php – load $_SESSION
var.
<?PHP session_start(); $_SESSION['SESS_MEMBER_ID'] = 'stored variable'; session_write_close(); header("location:print.php"); ?>
print.php – print $ _SESSION var.
<?PHP session_start(); var_dump($_SESSION); ?>
запустите скрипт в своем браузере var_dump()
чтобы создать результаты
перейдите к c:\wamp\tmp
файлы, содержащие данные сеанса.
Прежде всего: индекс logedin
кажется странным для отслеживания входа пользователя в систему. Является ли это просто опечаткой на SO или действительно кодовой опечаткой?
Во-вторых (в зависимости от желаемого поведения) попробуйте другой подход для защиты страниц. Ваша страница должна выглядеть примерно так:
<?php include 'login.inc.php'; if(authorized()) { // put some more script here, if needed ?> // put some plain HTML here <?php } ?>
Где login.inc.php
обрабатывает сеанс, файлы cookie. В частности, authorized
функция должна возвращать TRUE, если клиент уже зарегистрирован. Если клиент не зарегистрирован, он должен отображать форму с действием $_SERVER['PHP_SELF']
и возвращать FALSE. Если вы login_submit
submit-input что-то вроде login_submit
, вы можете позволить login.inc.php
обрабатывать проверку.
Таким образом, вам не нужно направлять пользователей на специальную страницу входа в систему, и после входа в систему пользователю будет показана строка с запрошенной страницы. Вы можете настроить это немного, чтобы строки запросов были постоянными через вход в систему.
Попробуйте заменить
if($_POST){...}
с
if( isset($_POST['username']) && isset($_POST['password']) ){...}
… по крайней мере для целей отладки. Вполне возможно, что некоторые разные настройки вызывают непустой массив $ _POST, где этого не ожидается.
Кроме того, ваш код, кажется, пропускает вызовы exit()
после перенаправления header()
. Отправка заголовка HTTP-заголовка автоматически не останавливает ваш скрипт.
У меня была эта проблема с использованием WAMPSERVER для разработки на / localhost. Мне нужно было изменить session.use_only_cookies
как в строке, так и в настройке php.ini
из
session.use_only_cookies = 1
в
session.use_only_cookies = 0
объяснение
Использование сессий по умолчанию, основанных на файлах cookie, работало так, как ожидалось, но мне понадобилось решение без cookie. Начальная страница теста:
<?php // page1.php ini_set('session.use_cookies', '0'); session_start(); $_SESSION['time'] = time(); echo '<br /><a href="page2.php?' . SID . '">page 2</a>'; ?>
Данные сеанса были созданы и сохранены в каталоге temp WAMPSERVER, например C:\wamp\tmp\sess_0rkdlonl5uia717rf03d4svs16
. Ссылка, сгенерированная вышеуказанным кодом, похожа на (обратите внимание, что UID соответствует имени файла данных сеанса):
page2.php?PHPSESSID=0rkdlonl5uia717rf03d4svs16
Но пункт назначения page2.php выбрасывал неопределенные ошибки для переменной «время», пытаясь извлечь данные сеанса:
<?php // page2.php ini_set('session.use_cookies', '0'); session_start(); echo date('Y md H:i:s', $_SESSION['time']); echo '<br /><a href="page1.php?' . SID . '">page 1</a>'; ?>
Установив session.use_only_cookies
FALSE в скрипте перед session_start();
:
ini_set('session.use_only_cookies', '0');
или изменить его глобально в php.ini
:
; This option forces PHP to fetch and use a cookie for storing and maintaining ; the session id. We encourage this operation as it's very helpful in combatting ; session hijacking when not specifying and managing your own session id. It is ; not the end all be all of session hijacking defense, but it's a good start. ; http://php.net/session.use-only-cookies session.use_only_cookies = 0
решил проблему.
Спустя долгое время я исправил эту ошибку.
На моем localhost WAMP данные сеанса не сохраняются между загрузками страниц, поскольку данные сеанса хранятся в файле cookie, и для локального хоста не существует домена cookie.
Решение:
«session.cookie_domain» должен быть установлен в пустую строку для всех локальных доменных имен, а не только для «localhost» (но не должен быть пустым для локальных IP-адресов):
<?php ini_set('session.cookie_domain', (strpos($_SERVER['HTTP_HOST'],'.') !== false) ? $_SERVER['HTTP_HOST'] : ''); ?>
Спасибо Marcin Wiazowski, который разместил его здесь .
Столкнулась с той же проблемой, но это вызвано
session_regenerate_id(true);
Поэтому я просто удалил его из своего кода.
Обновите WAMP 2.5, и теперь проблема решена!