Здравствуйте. Есть задача: 1. Создайте главную страницу сайта index.php, которая будет неавторизованных пользователей отправлять на страницу авторизации, а авторизованных на ту страницу, которую они посещали последний раз ("А" или "Б"). Для пользователя главной страницы не будет видно, она нужна только для перенаправления. Авторизация осуществляется без пароля, а просто набрав логин. Меня интересует, в этом контексте как скрипт сделан? То есть отвечает ли он требованиям задачи? И вообще как код, не сильно страшный и нет ли больших ошибок? Чтобы проще было понять, я ее подробно закоментировал. Спасибо. ------------------------------------------------------------------------------------------------------------------------------------------- Это a.php (b.php индентичный) PHP: <?php header("Content-type: text/html; charset=utf-8"); session_start(); //Запись в cookie адреса страницы, то же самое для страницы b.php с таким же именем $lastPage = $_SERVER['REQUEST_URI']; setcookie('lastPage', $lastPage); //Если сессия создана, то поприветствовать пользователя и подключить файл logaut.php с кнопкой Выйти if(!empty($_SESSION['auth'])){ echo "Добро пожаловать, ". $_COOKIE['name'] .". Вы авторизованы. <br>"; include_once ("logaut.php"); //Если нажата кнопка Выйти в файле logaut.php, то уничтожить сессии if(isset($_POST['submit'])){ session_destroy(); } } ?> <h3>Страница A.php</h3> Перейти на страницу index.php <a href="index.php"><input type="submit" value="index.php"></a><br><br> Перейти на страницу b.php <a href="b.php"><input type="submit" value="b.php"></a><br><br> Вернутся в начало <a href="../index.php"><input type="submit" value="В начало"></a><br><br> --------------------------------------------------------------------------------------------------------------------------------------- Это index.php PHP: <?php session_start(); if(!empty($_SESSION['auth']) and $_SESSION['auth']){ //Если переменная $_SESSION['auth'] существует и значение ее true, то редирект на последнюю посещенную страницу: a.php или b.php, адрес которой в $_COOKIE['lastPage'] header("Location: ". $_COOKIE['lastPage']); }else { //Иначе нужен редирект на страницу авторизации header("Location: auth.php"); } ?> -------------------------------------------------------------------------------------------------------------------------------------------- Это auth.php PHP: <?php header("Content-type: text/html; charset=utf-8"); //Если нажата кнопка Войти ... if(isset($_POST['submit'])){ //Проверить, не пустая ли переменная $_POST['name'] if(!empty($_POST['name'])){ //Если логин введен, то записать имя в cookie и открыть сессию со знчением true. Редирект на последнюю посещенную страницу, адрес которой в $_COOKIE['lastPage'] session_start(); $name = $_POST['name']; setcookie('name', $name); $_SESSION['auth'] = true; header("Location: ". $_COOKIE['lastPage']); }else{ //Иначе, если нажата кнопка Войти, но форма, то есть переменная $_POST['name'] пустая, то вывести предупреждение echo "Вы не ввели логин. Заполните форму <br>"; } } ?> <h3>Cтраница авторизации</h3> <form action="" method="post"> Ваше логин: <input type="text" name="name"><br> <input type="submit" name="submit" value="Войти"><br> </form> --------------------------------------------------------------------------------------------------------------------------------------------- Это logaut.php PHP: <form action ="" method="post"> <input type="submit" name="submit" value="Выйти"></input><br><br> </form>
Спать видимо сильно хотел, когда называл его так, по английски ведь читается А, вот и написал так же на автомате. Ну ок... исправлю на О. И это все?
На этом форуме у меня складывается впечатление, что я нахожусь в каком - то постапокалиптическом мире
session_start - должно быть вверху страницы, а не вызывается после определенных действий. после header - exit() проверка на $_SESSION['auth'] есть, а на $_COOKIE['name'] нет, да и не фильтруется никак. хватит?
Для небольшого понимания, как войти на сайт, ну как бы нормально получилось, но неправильно, пускать всех, просто так. Создай хотя бы какой-нибудь массив для начала, с логинами и проверяй, есть ли данный логин, который пришёл из формы, в этом массиве. Пароль должен быть обязательно. Обязательно сделай вывод ошибок error_reporting(E_ALL) Пароль надо солить, что бы вкуснее было) После того, как всё это сделаешь читай про токены.
Спасибо, учту. --- Добавлено --- Спасибо --- Добавлено --- А В ПРИНЦИПЕ он правильно построен в общих чертах? То есть добавив все то, о чем вы написали, он станет вполне пригодным практически? И один конкретный вопрос: для редиректа на последнюю посещенную страницу что - то другое надо применять или то, что сделано подойдет?
Логика вроде правильно сделана. Но читать тяжело, как-то много скобок. Я по возможности стараюсь как-то так писать, чтобы не if, а потом партянка, а наоборот, if(!$not) - стоп или ещё что-то, а рабочий код просто без блоков. У тебя довольно простой скрипт, но как-то тяжело воспринимается. Ты ещё вопрос сформулировал так, что ответов тут ждать странно. Вот моя хуетень! Как вам? А) хуетень, но не писать же тебе об этом Б) крутотень, тут можно написать, но на крутотень пока не тянет.
Ну... смотри. С сессиями и куками ты намудрил. Ты делаешь setcookie, но не задаёшь время жизни, соответственно, куки будет жить до закрытия браузера, как и сессии. Странные моменты - вот, в auth.php Код (Text): //Иначе, если нажата кнопка Войти, но форма, то есть переменная $_POST['name'] пустая, то вывести предупреждение Такой ситуации вообще не должно быть, достаточно задать require в форме в поле логина. То, что у тебя разбросаны echo в коде, тоже не круто. Проще выводить уже всё в конце, где html часть. И header с кодировкой задавать перед выводом. Общая логика тоже как-то хромает. Вот я захожу. Попадаю на index.php. Меня перебрасывает на auth.php. Я ввожу логин, и меня пытается перебросить на последнюю посещённую страницу, хотя я их ещё не посещала. Я бы сделала как-то приблизительно так: Спойлер: index.php PHP: <?php session_start(); if (isset($_SESSION['name'])) { if (isset($_COOKIE['lastPage'])) { header("Location: {$_COOKIE['lastPage']}"); } else { header("Location: a.php"); } } else { header("Location: auth.php"); } ?> Спойлер: auth.php PHP: <?php if (isset($_POST['login'])) { session_start(); $_SESSION['name'] = htmlentities($_POST['name']); if (isset($_COOKIE['lastPage'])) { header("Location: {$_COOKIE['lastPage']}"); } else { header("Location: a.php"); } } header("Content-type: text/html; charset=utf-8"); ?> <h3>Cтраница авторизации</h3> <form method="post"> Ваш логин*: <input type="text" name="name" required><br> <input type="submit" name="login" value="Войти"><br> </form> Спойлер: a.php / b.php PHP: <?php session_start(); setcookie('lastPage', $_SERVER['REQUEST_URI'], time()+60*60*24*30); //1 месяц время жизни куки if (isset($_POST['logout'])) { $_SESSION = []; } $message = ''; if (isset($_SESSION['name'])) { $message = "Добро пожаловать, {$_SESSION['name']}. Вы авторизованы. <br>"; include_once ("logout.php"); } header("Content-type: text/html; charset=utf-8"); ?> <h3>Страница A.php</h3> Перейти на страницу index.php <a href="index.php"><input type="submit" value="index.php"></a><br><br> Перейти на страницу b.php <a href="b.php"><input type="submit" value="b.php"></a><br><br> Вернутся в начало <a href="../index.php"><input type="submit" value="В начало"></a><br><br> Спойлер: logout.php PHP: <form method="post"> <input type="submit" name="logout" value="Выйти"></input><br><br> </form> Пусть более опытные товарищи поправят, если что.
@Catrinblaidd, на странице авторизации должна быть только форма, обработчик и вся остальная логика в index.php
Увы, не достаточно. Ибо всё, что идёт от клиента, может быть подделано... В том числе и атрибут require может быть убран.
Never trust user input! 1. Логином может быть и номер телефона и емаил и просто ряд пробелов, точек и еще множество непонятной фигни. 2. Дело конечно ваше, но если вам по душе логины типа "--== }{ [] \/ /\ |-| ==--", то не забудьте тогда хотя бы их обратно декодировать перед выводом на экран.