В общем, буду краток. Входу - готовый код с примером. Честно.. сразу 4 действия главных будут: Регистрация Авторизация Выход из системы ( превращаешься в лалку ) Идентификация юзера Без стилей ( почти, наверно... постараюсь )... чисто демонстрация. Начнем с главного .htaccess: Код (Text): AddDefaultCharset UTF-8 DirectoryIndex index.php RewriteEngine On # Redirect Trailing Slashes If Not A Folder... RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/$ /$1 [L,R=301] # Handle Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] Не создается ? блокнотом сохранить без имени. notepad++ Дальше index.php: PHP: <?php error_reporting ( E_ALL ); use Aero\Lerma; require 'Aero/AeroBase.php'; # Start... ( $main = new Aero\Application\Main( __DIR__ ) ) -> send(); $main -> runable( $main -> make( Aero\Supports\Auth::class, [ Aero\Configures\Auth::class ] ) ); # ---------- $pages = [ 'auth', 'reg', 'logout' ]; if ( !empty ( $uri = trim ( parse_url ( $_SERVER['REQUEST_URI'], 5 ), '/' ) ) ) { require Aero::Separator( ( in_array ( $uri, $pages ) ? [ '/resources/pages/%s.php', $uri ] : '/resources/view/pages/404.php' ) ); } else { require Aero::Separator( '/resources/view/pages/default.php' ); } отображаем сразу все ошибки чтобы не нубить.. Подключение ядра AeroBase Запуск библиотек.. Мини недоРоутер -------------------------------------- Теперь создаем папки: Aero public resources В папке Aero будет находится ядро системы для нашей демонстрации Создаем там файл AeroBase.php: PHP: <?php namespace Aero { class AeroBase { public static $app; protected static $NAMESPACESMAP = [ Interfaces\LermaDrivers::class => 'Interfaces\Lerma\IDrivers', Lerma::class => 'Supports\Lerma\Lerma' ]; public static function autoload( string $autoload ) { if ( isset ( self::$NAMESPACESMAP[$autoload] ) ) # Преобразование загруженной директории из имени пространства { $autoload = self::$NAMESPACESMAP[$autoload]; } elseif ( !file_exists ( ( $autoload = substr ( __DIR__, 0, -4 ) . $autoload ) . '.php' ) ) { throw new \Exception( '~~ Invalid namespace ' . $autoload ); } include strtr ( $autoload, '\\', DIRECTORY_SEPARATOR ) . '.php'; } public static function Separator( $path ) { return strtr ( self::$app -> Directory . ( is_array ( $path ) ? sprintf ( ...$path ) : $path ), '/', DIRECTORY_SEPARATOR ); } } } namespace { final class Aero extends Aero\AeroBase {} spl_autoload_register ( [ Aero::class, 'autoload' ] ); } Два пространства в одном файле. Не стоит говорить что это "писец". Так задумано. Автозагрузка классов. Добрый Сепка. -------------------------------------- Идем в интернет и скачиваем папочки с содержимым: Lerma - Библиотека для работы с базой данных. Auth - Процедура Идентификация пользователей Все закачали, заменить - да, готово! Папочки и файлик.. Спойлер: Чуть не забыл... Один из главных компонентов... Application/Main.php... да, да создавай папку с файлом! PHP: <?php namespace Aero\Application; use Aero; class Main { # loads components public $components = []; # public $buffer; public $Directory; #public $htmlPath; #public $pagePath; public function __construct ( string $Directory ) { Aero::$app = $this; $this -> Directory = $Directory; } public function __get( $name ) { if ( isset ( $this -> $name ) ) { return $this -> $name; } if ( isset ( $this -> components[$name] ) ) { return $this -> components[$name]; } throw new \Exception( '~~ Invalid get parameter ' . $name ); } public function make( string $name, array $parameters = [] ) { $explode = explode ( '\\', $name ); return $this -> components[end ( $explode )] = new $name( ...$parameters ); } public function send() { $this -> header(); register_shutdown_function ( [ $this, 'view' ] ); } public function runable( ...$args ) { foreach ( $args AS $arg ) { $arg -> run(); } } protected function header() { session_name ( 'EASYSINGLE_SESSID' ); session_start (); ob_start (); } public function view() { $contents = ob_get_contents (); ob_end_clean (); include Aero::Separator( '/resources/view/template.php' ); } } Выходим с Aero... -------------------------------------- И заходим в resources. Создаем ветки папок: resources\pages - будут находиться файлы которые относятся к недоРоутеру. resources\view\pages - тут мы и остановимся в ней. html содержимое. Отдышались... И поехали создавать файлики... 404.php HTML: Страница не найдена Authform.php - Форма авторизации HTML: <div class="RAY_WRAPPER_REGISTER"> <form action="/auth" method="POST"> <input type="text" name="<?= Aero::$app -> Auth -> form -> email ?>" placeholder="Email"> <input type="password" name="<?= Aero::$app -> Auth -> form -> pass ?>" placeholder="Password"> <button type="submit">AuthMe</button> </form> </div> Regform.php - Форма регистрации PHP: <div class="RAY_WRAPPER_REGISTER"> <form action="/reg" method="POST"> <div class="REGISTER-ONE-STEP REGISTER-VISIBLE"> <input type="text" name="<?= Aero::$app -> Auth -> form -> name ?>" placeholder="Username"> <input type="text" name="<?= Aero::$app -> Auth -> form -> email ?>" placeholder="Email"> <input type="password" name="<?= Aero::$app -> Auth -> form -> pass ?>" placeholder="Password"> <input type="password" name="<?= Aero::$app -> Auth -> form -> confirm ?>" placeholder="Retype password"> <button type="submit">Register</button> </div> </form> </div> default.php - Дефолт, стартовая страница PHP: <p>Привет <?= Aero::$app -> Auth -> username ?>!</p> <? if ( Aero::$app -> Auth -> isLogged ) { ?> <p>Ты авторизован</p> <p>Нажми на кота чтобы выйти! <br> <a href="/logout"><img src="/public/images/logout.png"></a> <? } else { ?> <p><a href="/auth">Авторизация</a></p> <p><a href="/reg">Регистрация</a></p> <? } выходим из этой папки и создаем шаблон файл. resources\view\template.php HTML: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <title>test</title> <link type="text/css" rel="stylesheet" href="/public/css/style.css"> </head> <body class="BORDER_RED"> <?= $contents . PHP_EOL ?> </body> </html> снова выходи выше.. и заглядываем в pages --- Добавлено --- Создаем наши странички ( site/auth ): auth.php PHP: <?php use Aero\Lerma; if ( Aero::$app -> Auth -> isLogged ) { header ( 'Location: /?no' ); exit; } if ( $_SERVER['REQUEST_METHOD'] === 'POST' ) { $ARGS = [ Aero::$app -> Auth -> form -> email => FILTER_VALIDATE_EMAIL, Aero::$app -> Auth -> form -> pass => FILTER_DEFAULT ]; $error = []; $INPUTS = filter_input_array ( INPUT_POST, $ARGS ); if ( in_array ( NULL, $INPUTS, TRUE ) ) { $error['undefined'] = 'Undefined inputs name :('; } elseif( !$INPUTS[Aero::$app -> Auth -> form -> email] ) { $error['email'] = 'Invalid is email.'; } else { $lerma = Lerma::prepare( [ 'SELECT id, username, password FROM %s WHERE email = ?', Aero::$app -> Auth -> form -> table ], [ strtolower ( $INPUTS[Aero::$app -> Auth -> form -> email] ) ] ); if ( $lerma -> rowCount() == 0 OR !password_verify ( $INPUTS[Aero::$app -> Auth -> form -> pass], ( $account = $lerma -> fetch( Lerma::FETCH_OBJ ) ) -> password ) ) { $error['data'] = 'Введенные данные не верны.'; } } if ( !empty ( $error ) ) { echo implode ( '<br>', $error ); } else { $password_hash = password_hash ( $INPUTS[Aero::$app -> Auth -> form -> pass], PASSWORD_DEFAULT ); $hash = md5 ( $account -> id . $account -> username . $password_hash ); Lerma::query( [ 'UPDATE %s SET password = "%s", hash = "%s", online = %d WHERE id = %d', Aero::$app -> Auth -> form -> table, $password_hash, $hash, $_SERVER['REQUEST_TIME'], $account -> id ] ); setcookie ( Aero::$app -> Auth -> data -> cookie, $hash, strtotime ( Aero::$app -> Auth -> data -> time ), '/' ); header ( 'Location: /?' . $account -> username ); exit; } } require Aero::Separator( '/resources/view/pages/Authform.php' ); --- Добавлено --- ( site/reg ) reg.php ( site/logout ) logout.php https://github.com/MouseZver/My-garbage-code/tree/master/php.ru/64708/66872 Сволочи не помещаются сюда.... Осталось чуть чуть... Заходим в папку public (находится в корне каталогов) Создаем папу css и images. css стиль кидаем куда надо.
style.css Код (CSS): @charset "utf-8"; /* body, form, ul, li, p, h1, h2, h3, h4, h5, h6 { margin: 0; padding: 0; } */ ui, li { list-style: none; } h1, h2, h3, h4, h5, h6 { font-size: 100%; font-weight: normal; } body { font: normal 13px/17px Tahoma, "Trebuchet MS", Helvetica, sans-serif; color: #000; } .RAY_WRAPPER_REGISTER form { width: 390px; } .RAY_WRAPPER_REGISTER input[type="text"], .RAY_WRAPPER_REGISTER input[type="password"] { font-size: .9em; width: 100%; height: 32px; box-sizing: border-box; padding: 5px 10px; margin-bottom: 10px; } Закончили... Идем создаем таблицу users. запрос тык: PHP: CREATE TABLE `users` ( `id` int(11) NOT NULL, `username` text NOT NULL, `email` text NOT NULL, `password` text NOT NULL, `status` int(2) NOT NULL DEFAULT '1', `datareg` int(11) NOT NULL, `online` int(11) NOT NULL, `hash` text ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ALTER TABLE `users` ADD PRIMARY KEY (`id`); ALTER TABLE `users` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; Дальше лезем в настройки: Aero\Configures\Lerma.php Указываем к какой бд законектимся.. 'dbname' => 'сюда', ну и логин и т.д. Спойлер: Все наконец! Херас там! скачай кота и засунь в папку с изображениями на память! API - кто в танке: Aero::$app -> Auth -> username - Никнейм юзера. Aero::$app -> Auth -> status - По дефолту пользователям присваевается при регистрации единица. Тоесть - обычный пользователь. Aero::$app -> Auth -> isLogged - булевое значение Пользователь или Гость. Чет оказалось не на легкой основе .. P.s: некие места в основе потерпели к велоизобретению =( Ничего вроде не забыл...
не предусмотрено, так как в это направление абстрактно лишь проходил. По русски: нет знаний чтобы создать виртуальность этой атаки на свой же код.
Обновил: Библиотеку Аутентификации, добавив csrf Проверка токенов в двух файлов resources\pages\auth.php resources\pages\reg.php ну и соответственно формы для активации csrf: resources\view\pages\Authform.php HTML: <div class="RAY_WRAPPER_REGISTER"> <form action="/auth" method="POST"> <input type="text" name="<?= Aero::$app -> Auth -> form -> email ?>" placeholder="Email"> <input type="password" name="<?= Aero::$app -> Auth -> form -> pass ?>" placeholder="Password"> <input type="hidden" name="<?= Aero::$app -> Auth -> form -> csrf -> name ?>" value="<?= Aero::$app -> Auth -> csrf ?>"> <button type="submit">AuthMe</button> </form> </div> resources\view\pages\Regform.php HTML: <div class="RAY_WRAPPER_REGISTER"> <form action="/reg" method="POST"> <div class="REGISTER-ONE-STEP REGISTER-VISIBLE"> <input type="text" name="<?= Aero::$app -> Auth -> form -> name ?>" placeholder="Username"> <input type="text" name="<?= Aero::$app -> Auth -> form -> email ?>" placeholder="Email"> <input type="password" name="<?= Aero::$app -> Auth -> form -> pass ?>" placeholder="Password"> <input type="password" name="<?= Aero::$app -> Auth -> form -> confirm ?>" placeholder="Retype password"> <input type="hidden" name="<?= Aero::$app -> Auth -> form -> csrf -> name ?>" value="<?= Aero::$app -> Auth -> csrf ?>"> <button type="submit">Register</button> </div> </form> </div> --- Добавлено --- API + Aero::$app -> Auth -> csrf - регистрирует и выдает токен Aero::$app -> Auth -> form -> csrf -> name - выводит идентификатор индекса csrf