Я пытаюсь решить проблемную часть кода на веб-сайте, который я не написал. Владелец пытается войти в администрацию CMS на своем сайте, но форма входа ведет только к бесконечному циклу перенаправления. Это пользовательская CMS, написанная кем-то другим, но парень прервал любую связь с владельцем и теперь работает на конкурирующую компанию (похоже на саботаж), так что владелец попросил меня попытаться ее решить. Но как только я не эксперт по PHP и код не написан мной, я застрял, и я не хочу полностью ломать его сайт (я не профессионал, и я делаю это в одолжение).
Вот код страницы, которая, я думаю, создает проблему: бесконечный цикл происходит: /admin/login?login=true
,
<?php
if (!defined('APP_DOMAIN')) {header('Location: http://google.com', true); exit();}
/**
* Zavádzacia class pre admin ako taký.
* @author --
* @version 1.0
* @package Bsystem
* @todo jazyk bude spoplatneny, podla toho bude aj iny ako SK
*/
class admin
{
/**
* @var array Tu su ulozene vsetky premenne, ktore sa prenasaju do inych
* tried
*/
private $vars = array(
'admin_page_landing' => FALSE,
'admin_page_request' => FALSE,
'admin_page_request_num' => FALSE,
'admin_page_request_last' => FALSE,
'admin_config' => FALSE,
'admin_page_login' => FALSE,
'admin_page_lost' => FALSE,
'web_config' => FALSE,
'post_action' => FALSE,
);
/**
* Platnosť nastavím na max, ale max doba prihlásenia je APP_COOKIE_LIFETIME
* to koli tomu aby im vždy vypísalo že vypršal čas prihlásenia než sa
* zmaže _SESSION
*/
public function __construct() {
//error_reporting(E_ALL | E_STRICT);
header('Cache-Control: no-cache, no-store, must-revalidate'); // HTTP 1.1.
header('Pragma: no-cache'); // HTTP 1.0.
header('Expires: 0'); // Proxies.
mb_internal_encoding(APP_CHARSET);
ini_set('session.cookie_domain', APP_COOKIE_DOMAIN);
// je vetsi o hodinu, aby mu ukazalo ze vyprsal cas prihalsenia
ini_set('session.cookie_lifetime', 0);
ini_set('session.gc_maxlifetime', 86400);
session_set_cookie_params(86400);
error_reporting(1);
//error_reporting(E_WARNING);
header('Content-Type: text/html; charset='.APP_CHARSET.'');
session_start();
$this->vars['post_action'] = APP_DOMAIN.substr($_SERVER['REQUEST_URI'], 1);
}
/**
* Takze tu vparsujem seo, _get, _post a prazdne indexy sa zmazu
* @global Object $user
*/
public function router() {
global $user;
// parsovanie SEO
$request = rest::requestUrlCompile(str_replace(
'admin/', '', $_SERVER['REQUEST_URI']));
// parsovanie _GET + ich validacia
if ($user->user_logged == TRUE) {
// odhlasenie
if ($request[1] == 'logout') {
$user->logoutUser();
header('Location: '.APP_DOMAIN.'admin/login', TRUE);
} elseif ($request[1] == 'login') {
header('Location: '.APP_DOMAIN.'admin/', TRUE);
} elseif ($request[1] == 'lost') {
header('Location: '.APP_DOMAIN.'admin/', TRUE);
} else {
// ziskanie id/stranky/cislovania/strankovania
if (is_numeric($request[sizeof($request)])) {
$this->vars['admin_page_request_num'] = $request[sizeof($request)];
// vymazeme cislo
unset($request[sizeof($request)]);
}
// nastavenie admin_page_request_last
$this->vars['admin_page_request_last'] = $request[sizeof($request)];
if (sizeof($request) == 0) {
// @todo ak je uvodka, skocit na view ? Treba nacitat este aj
// take srandy ako statistiky a podobne...
header('Location: '.APP_DOMAIN.'admin/module');
exit();
$this->vars['admin_page_landing'] = true;
} else {
$this->vars['admin_page_request'] = $request;
}
}
} else {
if ($request[1] == 'login') {
if (sizeof($request) > 1) {
header('Location: '.APP_DOMAIN.'admin/login?error=user_must_login', TRUE);
exit;
} else {
$this->vars['admin_page_login'] = TRUE;
}
} elseif ($request[1] == 'lost') {
// vygenerovanie hesla na požiadavku z emailu
if (isset($request[2])) {
if (strlen($request[2]) == 64 && preg_match('/[a-f0-9]/', $request[2])) {
$user->lostUserGenerate($request[2]);
} else {
header('Location: '.APP_DOMAIN.'admin/lost', TRUE);
exit;
}
}
$this->vars['admin_page_lost'] = TRUE;
} else {
// presmernovanie na login
header('Location: '.APP_DOMAIN.'admin/login?error=user_must_login', TRUE);
exit;
}
}
}
/**
* Nastavenie jazyka
*/
public function language() {
$_SESSION[LANGUAGE_SESSION] = LANGUAGE_DEFAULT;
}
/**
* Všeobecné spustenie configov
*/
public function config() {
$this->setWebConfig();
}
/**
* Nastavenie web configu
* @return array $this->vars['web_config']
*/
private function setWebConfig() {
$config = webModel::getWebConfig();
$this->vars['web_config'] = $config[0];
}
public function controller() {
if ($this->vars['admin_page_landing'] == TRUE) {
// uvodka
require_once '../'.APP_CONTROLLER.'indexAdminController.php';
$controller = new indexAdminController($this->vars);
$this->view($controller->view.'.php');
} else {
// hladat controller podla request atd
if (file_exists('../'.APP_CONTROLLER.$this->vars['admin_page_request'][1].
'/'.$this->vars['admin_page_request'][1].'AdminController.php')) {
require_once '../'.APP_CONTROLLER.$this->vars['admin_page_request'][1].
'/'.$this->vars['admin_page_request'][1].'AdminController.php';
$controller_name = $this->vars['admin_page_request'][1].'AdminController';
$controller = new $controller_name($this->vars);
$vars = $controller->loadVars();
foreach ($vars as $num => $key) {
if (!isset($this->vars[$key])) {
$this->vars[$key] = $controller->$key;
}
}
$this->view($controller->view.'.php');
} else {
throw new Exception('[ERROR load] controller \''.$this->vars['admin_page_request'][1].'\'
doesn\'t exists!');
}
}
}
/**
* Zobrazenie súborov, treba to nie len v controlleri ale aj tu na niektoré
* súbory. Prehľadnejšie sa to potom robí ako priamo includovať.
* @param type $file nazov suboru ktory sa zobrazi
* @param type $error ak je nejaky error, napr 404, zavola sa dany subor
* @throws Exception Ak $file aj $error su NULL
* @global Object $user
*/
public function view($file = NULL, $error = NULL) {
global $user;
// načitanie premenných aby to nešlo cet $this
foreach (array_keys($this->vars) as $key => $name) {
$$name = $this->vars[$name];
}
require_once '../'.APP_APP.'functions_admin.php';
if (isset($error)) {
switch ($error) {
case 404 :
require_once '../'.APP_VIEW.WEB_ERROR_404;
break;
}
// za každým errorom to terminatneme
exit();
} else if (isset($file)) {
require_once '../'.APP_VIEW.$file;
} else {
throw new Exception('[ERROR input] variable $file and $error is empty!');
}
}
public function multiLang($lang = NULL) {
if (!empty($lang)) {
if (defined('LANGUAGE') && strpos($this->vars['web_config']['web_language'], $lang) !== FALSE) {
return TRUE;
} else {
return FALSE;
}
}
}
public function __get($var) {
if (isset($this->vars[$var])) {
return $this->vars[$var];
} else {
throw new Exception('[ERROR output] var '.$var.' doesn\'t exist!');
}
}
}
?>
Задача ещё не решена.
Других решений пока нет …