Я создал сравнительно небольшой сайт на основе php / mysql и разместил его на сервере под управлением Red Hat 6.4, Apache / 2.2.15. Чтобы получить доступ к сайту, пользователи должны пройти аутентификацию.
Теперь возникает странная проблема. Когда я запускаю сервер, сайт изначально работает нормально, но примерно через 12-24 часа сеансы php перестают работать. Когда пользователи пытаются войти в систему, их учетные данные успешно извлекаются из базы данных, а сценарий входа устанавливает переменные сеанса, но когда они перенаправляются на домашнюю страницу — переменные сеанса теряются, поэтому домашняя страница считает, что они не вошли в систему. и они перенаправляются обратно на страницу входа. Сайт не используется интенсивно, на нем зарегистрировано около 50 пользователей и ежедневно регистрируется до 100 пользователей. Кроме того, сайту требуется код приглашения для регистрации, поэтому вероятность появления ботов на сайте очень мала.
Ниже приведены функции PHP, используемые для запуска сеанса, входа пользователей и проверки их подлинности (код был основан на http://www.wikihow.com/Create-a-Secure-Login-Script-in-PHP-and-MySQL):
function SecSessionStart() {
$session_name = 'sec_session_id'; // Set a custom session name
$secure = false;//https is not enforced
// 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.
}
function Login($username, $password) {
$username=trim($username);
if (CheckUserCredentials($username, $password))
{
$userId=GetUserIdByUsername($username);
$hashedPass=hash("sha512",$password);$user_browser = $_SERVER['HTTP_USER_AGENT'];
$_SESSION['user_id'] = $userId;
// XSS protection as we might print this value
$username = strtolower($username);
$_SESSION['username'] = $username;
$_SESSION['login_string'] = hash('sha512', $hashedPass.$user_browser);
// Login successful.
session_write_close();
return true;
}
else {
session_write_close();
return false;
}
}
function LoginCheck() {
// Check if all session variables are set
if (isset($_SESSION['user_id'], $_SESSION['username'], $_SESSION['login_string']))
{
$user_id = $_SESSION['user_id'];
$login_string = $_SESSION['login_string'];
$username = $_SESSION['username'];
// Get the user-agent string of the user.
$user_browser = $_SERVER['HTTP_USER_AGENT'];
$hash=GetPasswordHashByUserId($user_id);
if ($hash==null)
{
session_destroy();
session_write_close();
return false;
}
$login_check = hash('sha512', $hash.$user_browser);
if ($login_check == $login_string) {
// Logged In
session_write_close();
return true;
} else {
// Not logged in
session_destroy();
session_write_close();
return false;
}
}
session_destroy();
session_write_close();
return false;
}
Чтобы проверить мое предположение, что проблема связана с сессиями, я сделал следующую страницу php и настроил мониторинг на ней раз в 5 минут на контроллере работоспособности:
<?php
require_once("include/authentication.php");
SecSessionStart();
$_SESSION['sessionCheck'] = "The cookie was successfully saved and retrieved";
session_write_close();
$_SESSION['sessionCheck']="";
SecSessionStart();
if (isset($_SESSION['sessionCheck']))
{
echo($_SESSION['sessionCheck']);
}
session_destroy();
session_write_close();
?>
Как я и подозревал, страница вернула правильный ответ в течение 20 часов, а затем я получил предупреждение о том, что на странице не отображается строка успеха. После того, как я получил предупреждение, часть входа на сайт тоже не работала. Я попытался перезапустить процесс httpd, чтобы восстановить сеансы, но это не помогло. Только после полного перезапуска сервера все нормализовалось.
Я попытался найти проблему на SO и других сайтах и нашел некоторые вопросы, которые как-то были связаны, но они не полностью соответствовали моей ситуации. Основное различие между моей проблемой и другими подобными заключается в том, что поначалу сайт работает отлично, но через некоторое время сессии все время терпят неудачу. У других постеров были проблемы, когда они время от времени теряли сессии или сессии вообще не работали.
Любой намек на возможный источник этой проблемы будет любезно оценен. Если вам нужна дополнительная информация от меня, которая может помочь, пожалуйста, дайте мне знать.
Спасибо
Задача ещё не решена.
Других решений пока нет …