За последние 24 часа нас посетили 14922 программиста и 1730 роботов. Сейчас ищут 762 программиста ...

Оцените небольшой скрипт

Тема в разделе "Решения, алгоритмы", создана пользователем Потенциальный программист, 14 июл 2018.

  1. Потенциальный программист

    С нами с:
    14 июл 2018
    Сообщения:
    5
    Симпатии:
    0
    Здравствуйте. Есть задача:
    1. Создайте главную страницу сайта index.php, которая будет неавторизованных
    пользователей отправлять на страницу авторизации, а авторизованных на ту
    страницу, которую они посещали последний раз ("А" или "Б"). Для пользователя
    главной страницы не будет видно, она нужна только для перенаправления.

    Авторизация осуществляется без пароля, а просто набрав логин. Меня интересует, в этом контексте как скрипт сделан? То есть отвечает ли он требованиям задачи? И вообще как код, не сильно страшный и нет ли больших ошибок? Чтобы проще было понять, я ее подробно закоментировал. Спасибо.
    -------------------------------------------------------------------------------------------------------------------------------------------
    Это a.php (b.php индентичный)
    PHP:
    1. <?php
    2.     header("Content-type: text/html; charset=utf-8");
    3.     session_start();
    4.    
    5.     //Запись в cookie адреса страницы, то же самое для страницы b.php с таким же именем
    6.     $lastPage = $_SERVER['REQUEST_URI'];
    7.     setcookie('lastPage', $lastPage);
    8.    
    9.     //Если сессия создана, то поприветствовать пользователя и подключить файл logaut.php с кнопкой Выйти
    10.     if(!empty($_SESSION['auth'])){
    11.         echo "Добро пожаловать, ". $_COOKIE['name'] .". Вы авторизованы. <br>";
    12.         include_once ("logaut.php");
    13.        
    14.         //Если нажата кнопка Выйти в файле logaut.php, то уничтожить сессии
    15.         if(isset($_POST['submit'])){
    16.             session_destroy();
    17.         }
    18.     }
    19. ?>
    20. <h3>Страница A.php</h3>
    21.  
    22. Перейти на страницу index.php <a href="index.php"><input type="submit" value="index.php"></a><br><br>
    23. Перейти на страницу b.php <a href="b.php"><input type="submit" value="b.php"></a><br><br>
    24. Вернутся в начало <a href="../index.php"><input type="submit" value="В начало"></a><br><br>
    ---------------------------------------------------------------------------------------------------------------------------------------
    Это index.php
    PHP:
    1. <?php
    2.     session_start();
    3.     if(!empty($_SESSION['auth']) and $_SESSION['auth']){
    4.         //Если переменная $_SESSION['auth'] существует и значение ее true, то редирект на последнюю посещенную страницу: a.php или b.php, адрес которой в $_COOKIE['lastPage']
    5.         header("Location: ". $_COOKIE['lastPage']);
    6.     }else {
    7.         //Иначе нужен редирект на страницу авторизации
    8.         header("Location: auth.php");
    9.     }
    10. ?>
    --------------------------------------------------------------------------------------------------------------------------------------------
    Это auth.php
    PHP:
    1. <?php
    2.     header("Content-type: text/html; charset=utf-8");
    3.    
    4.     //Если нажата кнопка Войти ...
    5.     if(isset($_POST['submit'])){
    6.        
    7.         //Проверить, не пустая ли переменная $_POST['name']
    8.         if(!empty($_POST['name'])){
    9.            
    10.             //Если логин введен, то записать имя в cookie и открыть сессию со знчением true. Редирект на последнюю посещенную страницу, адрес которой в $_COOKIE['lastPage']
    11.             session_start();
    12.             $name = $_POST['name'];
    13.             setcookie('name', $name);
    14.             $_SESSION['auth'] = true;
    15.             header("Location: ". $_COOKIE['lastPage']);
    16.            
    17.         }else{
    18.             //Иначе, если нажата кнопка Войти, но форма, то есть переменная $_POST['name'] пустая, то вывести предупреждение
    19.             echo "Вы не ввели логин. Заполните форму <br>";
    20.         }
    21.     }
    22. ?>
    23. <h3>Cтраница авторизации</h3>
    24. <form action="" method="post">
    25.     Ваше логин: <input type="text" name="name"><br>
    26.                 <input type="submit" name="submit" value="Войти"><br>
    27. </form>
    ---------------------------------------------------------------------------------------------------------------------------------------------
    Это logaut.php
    PHP:
    1. <form action ="" method="post">
    2. <input type="submit" name="submit" value="Выйти"></input><br><br>
    3. </form>
     
  2. Потенциальный программист

    С нами с:
    14 июл 2018
    Сообщения:
    5
    Симпатии:
    0
    Просмотры есть, а ответов нет. Наверное в нокауте все от моего шедевра
     
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.793
    Симпатии:
    1.330
    Адрес:
    Лень
    Просто в замешательстве от одного наименования скрипта
     
  4. Потенциальный программист

    С нами с:
    14 июл 2018
    Сообщения:
    5
    Симпатии:
    0
    Спать видимо сильно хотел, когда называл его так, по английски ведь читается А, вот и написал так же на автомате. Ну ок... исправлю на О. И это все?
     
  5. Потенциальный программист

    С нами с:
    14 июл 2018
    Сообщения:
    5
    Симпатии:
    0
    На этом форуме у меня складывается впечатление, что я нахожусь в каком - то постапокалиптическом мире
     
  6. lastdays

    lastdays Активный пользователь

    С нами с:
    27 сен 2012
    Сообщения:
    410
    Симпатии:
    74
    session_start - должно быть вверху страницы, а не вызывается после определенных действий.
    после header - exit()
    проверка на $_SESSION['auth'] есть, а на $_COOKIE['name'] нет, да и не фильтруется никак.

    хватит?
     
  7. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Для небольшого понимания, как войти на сайт, ну как бы нормально получилось, но неправильно, пускать всех, просто так.

    Создай хотя бы какой-нибудь массив для начала, с логинами и проверяй, есть ли данный логин, который пришёл из формы, в этом массиве.

    Пароль должен быть обязательно.
    Обязательно сделай вывод ошибок error_reporting(E_ALL)

    Пароль надо солить, что бы вкуснее было)

    После того, как всё это сделаешь читай про токены.
     
  8. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Просто никому не интересен самописный бред. За такое в 2к18 расстреливать нужно. Это если без обид)
     
  9. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    учится человек
     
  10. Потенциальный программист

    С нами с:
    14 июл 2018
    Сообщения:
    5
    Симпатии:
    0
    Спасибо, учту.
    --- Добавлено ---
    Спасибо
    --- Добавлено ---
    А В ПРИНЦИПЕ он правильно построен в общих чертах? То есть добавив все то, о чем вы написали, он станет вполне пригодным практически? И один конкретный вопрос: для редиректа на последнюю посещенную страницу что - то другое надо применять или то, что сделано подойдет?
     
    #10 Потенциальный программист, 15 июл 2018
    Последнее редактирование: 15 июл 2018
  11. johovich

    johovich Активный пользователь

    С нами с:
    24 авг 2016
    Сообщения:
    146
    Симпатии:
    17
    Логика вроде правильно сделана. Но читать тяжело, как-то много скобок. Я по возможности стараюсь как-то так писать, чтобы не if, а потом партянка, а наоборот, if(!$not) - стоп или ещё что-то, а рабочий код просто без блоков.

    У тебя довольно простой скрипт, но как-то тяжело воспринимается. Ты ещё вопрос сформулировал так, что ответов тут ждать странно.

    Вот моя хуетень! Как вам?
    А) хуетень, но не писать же тебе об этом
    Б) крутотень, тут можно написать, но на крутотень пока не тянет.
     
    twim32 и MouseZver нравится это.
  12. Catrinblaidd

    Catrinblaidd Новичок

    С нами с:
    21 окт 2018
    Сообщения:
    13
    Симпатии:
    7
    Ну... смотри.
    С сессиями и куками ты намудрил.
    Ты делаешь setcookie, но не задаёшь время жизни, соответственно,
    куки будет жить до закрытия браузера, как и сессии.

    Странные моменты - вот, в auth.php
    Код (Text):
    1.  //Иначе, если нажата кнопка Войти, но форма, то есть переменная $_POST['name'] пустая, то вывести предупреждение
    Такой ситуации вообще не должно быть, достаточно задать
    require в форме в поле логина.

    То, что у тебя разбросаны echo в коде, тоже не круто. Проще выводить уже всё в конце, где html часть.
    И header с кодировкой задавать перед выводом.

    Общая логика тоже как-то хромает. Вот я захожу. Попадаю на index.php. Меня перебрасывает на auth.php.
    Я ввожу логин, и меня пытается перебросить на последнюю посещённую страницу, хотя я их ещё не посещала.

    Я бы сделала как-то приблизительно так:

    PHP:
    1. <?php
    2.     session_start();
    3.     if (isset($_SESSION['name'])) {
    4.         if (isset($_COOKIE['lastPage'])) {
    5.             header("Location: {$_COOKIE['lastPage']}");
    6.         } else {
    7.             header("Location: a.php");
    8.         }
    9.     } else {
    10.         header("Location: auth.php");
    11.     }
    12. ?>

    PHP:
    1. <?php
    2.     if (isset($_POST['login'])) {
    3.         session_start();
    4.         $_SESSION['name'] = htmlentities($_POST['name']);
    5.      
    6.         if (isset($_COOKIE['lastPage'])) {
    7.             header("Location: {$_COOKIE['lastPage']}");
    8.         } else {
    9.             header("Location: a.php");
    10.         }
    11.     }
    12.  
    13.     header("Content-type: text/html; charset=utf-8");
    14. ?>
    15.  
    16. <h3>Cтраница авторизации</h3>
    17. <form method="post">
    18.     Ваш логин*: <input type="text" name="name" required><br>
    19.     <input type="submit" name="login" value="Войти"><br>
    20. </form>

    PHP:
    1. <?php  
    2.     session_start();
    3.  
    4.     setcookie('lastPage', $_SERVER['REQUEST_URI'], time()+60*60*24*30); //1 месяц время жизни куки
    5.  
    6.     if (isset($_POST['logout'])) {
    7.         $_SESSION = [];
    8.     }
    9.  
    10.     $message = '';
    11.     if (isset($_SESSION['name'])) {
    12.         $message = "Добро пожаловать, {$_SESSION['name']}. Вы авторизованы. <br>";
    13.         include_once ("logout.php");
    14.     }
    15.  
    16.     header("Content-type: text/html; charset=utf-8");
    17. ?>
    18. <h3>Страница A.php</h3>
    19. Перейти на страницу index.php <a href="index.php"><input type="submit" value="index.php"></a><br><br>
    20. Перейти на страницу b.php <a href="b.php"><input type="submit" value="b.php"></a><br><br>
    21. Вернутся в начало <a href="../index.php"><input type="submit" value="В начало"></a><br><br>

    PHP:
    1. <form method="post">
    2. <input type="submit" name="logout" value="Выйти"></input><br><br>
    3. </form>

    Пусть более опытные товарищи поправят, если что.
     
  13. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Catrinblaidd, на странице авторизации должна быть только форма, обработчик и вся остальная логика в index.php
     
  14. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    Увы, не достаточно. Ибо всё, что идёт от клиента, может быть подделано... В том числе и атрибут require может быть убран.
     
  15. twim32

    twim32 Активный пользователь

    С нами с:
    29 мар 2017
    Сообщения:
    275
    Симпатии:
    58
    Never trust user input!
    1. Логином может быть и номер телефона и емаил и просто ряд пробелов, точек и еще множество непонятной фигни.
    2. Дело конечно ваше, но если вам по душе логины типа "--== }{ [] \/ /\ |-| ==--", то не забудьте тогда хотя бы их обратно декодировать перед выводом на экран.