Написал webgui на php. Для залогивания в него используется такой код:
<?php
require_once dirname(__FILE__)."/lib/config.php";
$f = array();
$errors = array();
$f['username'] = (isset($_POST['username']) && is_string($_POST['username'])) ? mb_trim($_POST['username']) : "";
$f['password'] = (isset($_POST['password']) && is_string($_POST['password'])) ? $_POST['password'] : "";
if (isset($_POST['submitted'])) {
require_once FILE_BASE."/db.php";
$user = $db->users->findOne(array('username' => $f['username'], 'password' => $f['password']));
//exit("here");
if (is_null($user)) {
$errors[] = "Access Denied!";
} else {
$_SESSION['user'] = $user;
$_SESSION['timezone'] = (isset($user['timezone'])) ? $user['timezone'] : DEFAULT_TIMEZONE;
go((isset($_GET['ret']) && is_string($_GET['ret'])) ? $_GET['ret'] : "{$www_base}/");
}
}
На моём компе с gentoo всё работает отлично. Однако на компе заказчика с дебианом возникла такая странная проблема:
если пользователь уже залогинен например в mozilla когда он заходит в другом браухере например chromium он попадает на страницу login.php, вводит корректные данные (username/password) и всё равно не может залогиниться. Как было выяснено код внутри else {} выполняется и $user сохраняется в $_SESSION['user'] однако после редиректа оказывается что этих данных нет в сессии. Вот код из /lib/config.php:
<?php
error_reporting(E_ALL ^ E_DEPRECATED);
define('IS_WEB', !(php_sapi_name() == 'cli'));
require_once dirname(__FILE__)."/conf.php";
require_once FILE_BASE."/func.php";
date_default_timezone_set("UTC");
mb_internal_encoding("UTF-8");
if (IS_WEB) {
$www_proto = (
isset($_SERVER['HTTPS']) && is_string($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == "on"
) ? "https" : "http";
$www_base = "{$www_proto}://{$_SERVER['HTTP_HOST']}{$conf['www_path']}";
if (get_magic_quotes_runtime()) set_magic_quotes_runtime(0);
if (get_magic_quotes_gpc()) {
function removeMagic($a) {
if (is_array($a)) {
foreach ($a as $key => $val) $a[$key] = removeMagic($a);
} else {
$a = stripslashes($a);
}
return $a;
}
$_GET = removeMagic($_GET);
$_POST = removeMagic($_POST);
$_COOKIE = removeMagic($_COOKIE);
}
session_set_cookie_params(
0, // unlimited lifetime
"{$conf['www_path']}",
$_SERVER['HTTP_HOST'],
false, // secure connections (httpS) only
true // HTTP only, no JavaScript allowed to modify cookies
);
session_start();
// Protection against CSRF attacks
if (!isset($_SESSION['csrf'])) $_SESSION['csrf'] = randStr();
if ($_SERVER['REQUEST_METHOD'] != 'GET') {
if (!( isset($_POST['csrf']) && is_string($_POST['csrf']) && $_POST['csrf'] == $_SESSION['csrf'] )) {
exit("CSRF attack!");
}
}
if (!(
preg_match('#/login\\.php$#', $_SERVER['PHP_SELF']) ||
preg_match('#/logout\\.php$#', $_SERVER['PHP_SELF']) ||
preg_match('#/users/index\\.php$#', $_SERVER['PHP_SELF']) ||
preg_match('#/users/passwd\\.php$#', $_SERVER['PHP_SELF'])
)) session_write_close();
}
Т.к. на моём компе всё работает подохреваю что дело в каких то настройках внутри php.ini.