Структура:
/result
│
├──/includes
│ │
│ ├──.htaccess
│ │
│ ├──configuration.inc
│ │
│ ├──connect.inc
│ │
│ ├──disconnect.inc
│ │
│ ├──functions.inc
│ │
│ ├──getuserinfo.inc
│ │
│ ├──gotologinpage.inc
│ │
│ ├──login.inc
│ │
│ ├──logout.inc
│ │
│ ├──mainmenu.inc
│ │
│ └──unsetuservariables.inc
│
├──/skins
│ │
│ ├──.htaccess
│ │
│ ├──getuserinfo.skin
│ │
│ ├──login.skin
│ │
│ └──mainmenu.skin
│
└──index.phtml
Директория includes:
Файл .htaccess:
<Files *.inc>
Order deny,allow
Deny from all
</Files>
Файл configuration.inc:
<?
$systemActions = array('login', 'logout', 'mainmenu', 'getuserinfo');
$sexArray = array('Ж', 'М');
$cookieDomain = $_SERVER['HTTP_HOST'];
$cookieName = 'cookie-authorization';
$cookiePath = preg_replace('/[^\/]+$/', '', $_SERVER['REQUEST_URI']);
$cookieSecure = true;
$cookieHttpOnly = true;
$dbhost = 'localhost';
$dbname = '******_education';
$dbuser = '******_education';
$dbpass = '******';
$domainName = $_SERVER['HTTP_HOST'];
$rootDirectory = preg_replace('/[^\/]+$/', '', $_SERVER['REQUEST_URI']);
?>
Файл connect.inc:
<?
mysql_connect($dbhost, $dbuser, $dbpass);
mysql_select_db($dbname);
mysql_query('set names utf-8;');
mysql_query('set collation_connection=utf8_general_ci;');
mysql_query('lock tables education_users write;');
?>
Файл disconnect.inc:
<?
mysql_query('unlock tables;');
mysql_close();
?>
Файл functions.inc:
<?
function getSkin($skinName)
{
$skinName = 'skins/'.$skinName.'.skin';
$skinContent = file_get_contents($skinName);
return "return <<<TMP\r\n{$skinContent}\r\nTMP;\r\n";
}
?>
Файл getuserinfo.inc:
<?
if(!isset($user_id) || !$user_id)
{
require('includes/unsetuservariables.inc');
require('includes/disconnect.inc');
require('includes/gotologinpage.inc');
}
print eval(getSkin('getuserinfo'));
return;
?>
Файл gotologinpage.inc:
<?
$LocationString = 'Location: https://'.$domainName.$rootDirectory;
header($LocationString);
exit;
?>
Файл login.inc:
<?
if(!isset($_POST['userLoginInForm']) || !isset($_POST['userPasswordInForm']))
{
print eval(getSkin('login'));
return;
}
else
{
$userResult = mysql_query('select user_id from education_users where user_login = \''.$_POST['userLoginInForm'].'\' and user_password = \''.sha1($_POST['userPasswordInForm']).'\';');
if(mysql_num_rows($userResult) != 1)
{
print eval(getSkin('login'));
return;
}
}
list($user_id) = mysql_fetch_row($userResult);
$user_hash = sha1(time());
mysql_query('update education_users set user_hash = \''.$user_hash.'\' where user_id = '.$user_id.';');
setcookie($cookieName, serialize(array($user_id, $user_hash)), 0, $cookiePath, $cookieDomain, $cookieSecure, $cookieHttpOnly);
require('includes/disconnect.inc');
$LocationString = 'Location: https://'.$domainName.$rootDirectory.'?a=mainmenu';
header($LocationString);
exit;
?>
Файл logout.inc:
<?
if(!isset($user_id) || !$user_id)
{
require('includes/unsetuservariables.inc');
require('includes/disconnect.inc');
require('includes/gotologinpage.inc');
}
mysql_query('update education_users set user_hash = \'\' where user_id = '.$user_id.';');
setcookie($cookieName, '', time() - 10000, $cookiePath, $cookieDomain, $cookieSecure, $cookieHttpOnly);
require('includes/unsetuservariables.inc');
require('includes/disconnect.inc');
require('includes/gotologinpage.inc');
?>
Файл mainmenu.inc:
<?
if(!isset($user_id) || !$user_id)
{
require('includes/unsetuservariables.inc');
require('includes/disconnect.inc');
require('includes/gotologinpage.inc');
}
print eval(getSkin('mainmenu'));
return;
?>
Файл unsetuservariables.inc:
<?
if(isset($user_id)) unset($user_id);
if(isset($user_password)) unset($user_password);
if(isset($user_hash)) unset($user_hash);
if(isset($user_name)) unset($user_name);
if(isset($user_login)) unset($user_login);
if(isset($user_phone)) unset($user_phone);
if(isset($user_sex)) unset($user_sex);
if(isset($user_age)) unset($user_age);
?>
Директория skins:
Файл .htaccess:
<Files *.skin>
Order deny,allow
Deny from all
</Files>
Файл getuserinfo.skin:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Информация о пользователе</title>
</head>
<body>
<h1>Информация о пользователе {$user_name}</h1><br>
Ваш ID: {$user_id}<br>
Ваше имя: {$user_name}<br>
Ваш телефон: {$user_phone}<br>
Ваш пол: {$sexArray[$user_sex]}<br>
Ваш возраст: {$user_age}<br>
Ваш логин: {$user_login}<br>
Хэш вашего пароля: {$user_password}<br>
Хэш вашей сессии: {$user_hash}<br><br><br>
← <a href="{$rootDirectory}?a=mainmenu">Вернуться в главное меню</a>
</body>
</html>
Файл login.skin:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Вход в систему</title>
</head>
<body>
<h1>Вход в систему</h1>
<form name="loginForm" action="{$rootDirectory}?a=login" method="post">
<input type="text" name="userLoginInForm">
<input type="password" name="userPasswordInForm">
<input type="submit" value="Войти в систему">
</form>
</body>
</html>
Файл mainmenu.skin:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Главное меню системы</title>
</head>
<body>
<h1>Здравствуйте, {$user_name}</h1><br>
Вы успешно прошли авторизацию и находитесь в главном меню системы. Эта часть сайта видна только авторизованным пользователям.<br><br>
— <a href="{$rootDirectory}?a=getuserinfo">Информация о пользователе</a><br><br><br>
<a href="{$rootDirectory}?a=logout">Выйти из системы</a> →
</body>
</html>
phtml-документ (index.phtml):
<?
require('includes/configuration.inc');
require('includes/functions.inc');
require('includes/connect.inc');
if(!isset($_GET['a']) || !in_array($_GET['a'], $systemActions)) $action = 'login';
else $action = $_GET['a'];
if(isset($user_id)) unset($user_id);
if(isset($user_hash)) unset($user_hash);
if(isset($_COOKIE[$cookieName]))
{
list($user_id, $user_hash) = @unserialize(stripslashes($_COOKIE[$cookieName]));
$user_id = addslashes($user_id);
$user_hash = addslashes($user_hash);
if(!is_numeric($user_id))
{
mysql_query('update education_users set user_hash = \'\' where user_id = '.$user_id.';');
setcookie($cookieName, '', time() - 10000, $cookiePath, $cookieDomain, $cookieSecure, $cookieHttpOnly);
require('includes/unsetuservariables.inc');
require('includes/disconnect.inc');
require('includes/gotologinpage.inc');
}
$userResult = mysql_query('select user_name, user_login, user_password, user_phone, user_sex, user_age from education_users where user_id = '.$user_id.' and user_hash = \''.$user_hash.'\';');
if(mysql_num_rows($userResult) != 1)
{
mysql_query('update education_users set user_hash = \'\' where user_id = '.$user_id.';');
setcookie($cookieName, '', time() - 10000, $cookiePath, $cookieDomain, $cookieSecure, $cookieHttpOnly);
require('includes/unsetuservariables.inc');
require('includes/disconnect.inc');
require('includes/gotologinpage.inc');
}
list($user_name, $user_login, $user_password, $user_phone, $user_sex, $user_age) = mysql_fetch_row($userResult);
if($action == 'login') $action = 'mainmenu';
}
require('includes/'.$action.'.inc');
require('includes/disconnect.inc');
?>
Результат:
Результат выполнения задания можно посмотреть
здесь.