Авторизация через сесиию

173
05 августа 2018, 16:30

Помогите внести ясность в простом вопросе, изучаю php, не могу понять одну простую вещь с переходом по адресу в теге action.

Делаю так, в файле auth.php проверяю пустой инпут или нет, если нет старную сессию и добавляю в гл.массив auth =true

//auth.php
if (!empty($_REQUEST['test'])) {
        session_start();
        $_SESSION['auth'] = true;
    } else {
        echo 'Пустой инпут';
        ?>
        <form action="" method="get">
            <input name="test">
            <input type="submit" value="SEND">
        </form>
        <?php
    }

Захожу во второй файл index.php и проверяю, выводится true, сессия работает на этом этапе все понятно.

//index.php
session_start(); //стартуем сессию
if (!empty($_SESSION['auth'])) { echo 'true'} else { echo 'false'; }

Но если я в файле auth.php в теге action прописываю action="index.php", то при перенаправлении на index.php получаю false.

Я так понимаю это связано с тем, что в первом случае файл auth.php считывается два раза и в итоге стартует сессию и В $_SESSION['auth'] пишет true, а втором случае повторное считывание не происходит и идет перенаправление сразу в index.php, где по сути $_SESSION['auth'] вовсе нет.

Как быть в такой ситуации не могу понять

Answer 1

Происходит все корректно, в первом случае:

  1. вы заходите на страницу auth.php, заполняете поле, жмете кнопку отправки
  2. При отправке формы с пустым action браузер отправляет запрос к текущему скрипту, то есть опять auth.php, условие выполняется, в сессию записывается нужное значение.
  3. вы переходите к файлу index.php, нужное значение уже в сессии

во втором случае вы исправляете action на index.php поэтому при отправке формы запрос уходит именно туда. Никакие параметры формы уже не проверяются, в сессию ничего не записывается, т.к. скрипт обработки формы стал другим.

Если вам необходимо после проверки данных формы переправить пользователя на другой скрипт, то обработчик формы следует оставить пустым (или явно auth.php), а после указания значений сессии программно перенаправить запрос на другой файл

 ....
 $_SESSION['auth'] = true;
 header("Location: index.php");
 exit(); 

При этом будет сформирован HTTP ответ с кодом 302, сервер отправит браузеру новый URL, по которому браузер автоматически и перейдет.

Перед вызовом header не должно быть никакого другого вывода данных, либо придется очистить буфер вывода с помощью ob_clean

Answer 2

У вас есть три файла (некоторые файлы могут быть объединены в один)

  1. Файл с формой
  2. Файл обработчик формы
  3. Произвольный файл

А дальше все просто

  • Во всех файлах всегда должен идти запуск сессии session_start()
  • В файле обработчики формы (тот который указан в атрибуте action) должна осуществляться проверка полей формы и устанавливаться или сбрасываться флаг аутентификации

    if (password_valid())
      $_SESSION['auth'] = true;
    else
      unset($_SESSION['auth']);
  • При необходимости проверить аутентификацию в любом месте программы, должен выполняться код

    if (isset($_SESSION['auth']))
Answer 3

empty — Проверяет, пуста ли переменная. Если вы не создавали $_SESSION['auth'] то будет ошибка. Проверяйте существование isset($_SESSION['auth'])

файл index.php
session_start();
//  если есть сесия 
if(isset($_SESSION['auth'])){
  echo 'true';
}
// иначе - подключаем форму
else{
  include 'auth.php';
}
файл auth.php
// Если есть переданный из формы пароль
if (isset($_POST['password'])) {
  $_SESSION['auth'] = true;
} else {
  // иначе выводим форму
  echo 'Пустой инпут';
  // не передавайте пароли в адресной строке. это плохая практика.
  // Также првоеряйте имена передаваемых и получаемых переменных. Если передаём пароль то и получать должны пароль.
  // Вы же передавали поле с именем test, а пытались получить $_REQUEST['password']
  ?>
  <form action="" method="post">
    <input name="password">
    <input type="submit" value="SEND">
  </form>
  <?php
}
READ ALSO
Обмен данными с вебсокетам через прокси SOCKS5

Обмен данными с вебсокетам через прокси SOCKS5

Подскажите пожалуйста, как можно обмениваться данными и вообще работать с вебсокетам через проксиЯ понимаю что прокси https не подойдут нужен...

198
Редирект на роут

Редирект на роут

Как сделать в Laravel редирект на роут? Пробовал так:

208