Чат Telegram
Группа ВКонтакте
Новый комментарий


fantasyz

удаление

if (!empty($_COOKIE)) {
    setcookie('login', $login, -10, '/');
    setcookie('password', $password, -10, '/');
    header('Location: /cookie/index.php');
}

проверка

if (!empty($_COOKIE)) {
    header('Location: /cookie/index.php');
}
ivashkevich

Хорошо, всё норм. Только для удаления cookie можно в качестве значения вообще передать пустую строку:

setcookie('login', '', -10, '/');
ivashkevich

А нет, не норм. Проверка проверяет только наличие cookie. При этом не гарантируется, что пользователь авторизован.

fantasyz
if (!empty($_COOKIE['login'] && $_COOKIE['password'])) {
    header('Location: /cookie/index.php');
} 

вот так по идее гарантируется

ivashkevich

Нет, так гарантируется только то, что в cookie есть какие-то данные, но не гарантируется, что эти данные принадлежат какому-то пользователю.

В общем, нужно попытаться их использовать для логина, и если логин успешен, то тогда уже редиректить. Иначе - считать пользователя неавторизованным.

fantasyz
require __DIR__ . '/auth.php';

if (!empty($_COOKIE)) {
    $login = $_COOKIE['login'];
    $password = $_COOKIE['password'];
    if (checkAuth($login, $password)) {
        header('Location: /cookie/index.php');
    }
}
ivashkevich

Вот, теперь логика правильная. Единственное что не учли - в cookie может что-то лежать, но не будет ключей login и password. В таком случае будет warning.

Нужно предусмотреть такой кейс и в переменную login положить пустую строку, если $_COOKIE['login'] не существует:

$login = $_COOKIE['login'] ?? '';

С паролем аналогично.

fantasyz

понял, с горем пополам осилил дз)), точнее с вашей помощью), спасибо большое!

ivashkevich

Не за что. Главное, что вы пробуете. Это 99% успеха :)

1nSide

logout.php

<?php

setcookie('login', '$login', -10, '/');
setcookie('password' , '$password', -10, '/');
header('location: indexCookie.php' );
1nSide

Во втором задании уже была проверка

ivashkevich

При простом переходе (без отправки POST-запроса) не будет у вас никакой проверки. Задание требует выполнения проверки при любом запросе.

1nSide

а где пароли хешировать? это если пользователь вошел то сделать чтобы они хешировались?

ivashkevich

Знаете, я переборщил с этим заданием. С последними двумя параграфами пока только ознакомьтесь (я их только что подправил). Усовершенствуем систему чуть позже.

arminbuuren86@gmail.com
function getUserLogin(): ?string
{
    $loginFromCookie = $_COOKIE['login'] ?? '';
    $passwordFromCookie = $_COOKIE['password'] ?? '';

    if (checkAuth($loginFromCookie, $passwordFromCookie)) {
        return $loginFromCookie;
    }

    return null;
}

Пишет, что ошибка в ?string на знак ? указывает, почему?

ivashkevich

Версия PHP 7.1? Если ниже - то не заработает.

arminbuuren86@gmail.com

CTRL + ALT + S -> Languages & Frameworks -> PHP. Там выбрана 7.1, еще есть ниже версии и выше 7.2. Может 7.2 выбрать?

ivashkevich

PhpStorm - это только редактор. Ошибка возникает во время выполнения скрипта, значит менять нужно версию интерпретатора. Если Вы всё делаете по урокам, то версию нужно менять в настройках OpenServer. Повторите уроки как работает PHP и установка и настройка OpenServer.

arminbuuren86@gmail.com

Спасибо за ответ. Буду разбираться. И спасибо вам за ваши уроки! Отличные и реально быстро понимаешь, что да как)

ivashkevich

Спасибо за отзыв) Удачи в прохождении)

arminbuuren86@gmail.com
Parse error: syntax error, unexpected '?' in C:\OpenServer\OSPanel\domains\autorizacion.loc\www\auth.php on line 15

вот что пишет

Fox-24

Спасибо за еще один урок!)

<?php

// Создайте страницу для разлогинивания - logout.php.
// При переходе на неё должны удаляться cookie с ключами login и password и выполняться редирект на главную страницу.
// В качестве ответа предоставьте полный код файла logout.php.

if (!empty($_COOKIE['login'])) {
    // Удаляем Cookie
    setcookie('login', $login, -10, '/');
    setcookie('password', $login, -10, '/');
    header('Location: /autorization/index.php');
}

У меня php 5.4, так что..)

//Сейчас при переходе авторизованного пользователя на страницу login.php открывается форма авторизации.
//Сделайте предварительную проверку того, что пользователь уже авторизован. И если он является авторизованным, перенаправляйте его на главную страницу.
// В качестве ответа на это задание предоставьте только код, который вы добавили в файл login.php.

if (!empty($_COOKIE)) {
    require __DIR__ . '/auth.php';
    if (isset($_COOKIE['login'])) {
        $login = $_COOKIE['login'];
    } else {
        // присваиваем $login значение '' если $_COOKIE['login'] равен NULL
        $login = '';
    }
    if (isset($_COOKIE['password'])) {
        $password = $_COOKIE['password'];
    } else {
        // присваиваем $password значение '' если $_COOKIE['password'] равен NULL
        $password = '';
    }

    $password = $_COOKIE['password'];
    if (checkAuth($login, $password)) {
        header('Location: /autorization/index.php');
    }
}
ivashkevich
  1. Можно не проверять перед удалением кукисов:
    if (!empty($_COOKIE['login'])) {
  2. Вот эта строка может накидать warning-ов (которая вне условия):
    $password = $_COOKIE['password'];
Fox-24
  1. Да, спасибо:)
  2. Забыл почистить код..

    require __DIR__ . '/auth.php';
    if (isset($_COOKIE['login'])) {
        $login = $_COOKIE['login'];
    } else {
        // присваиваем $login значение '' если $_COOKIE['login'] равен NULL
        $login = '';
    }
    if (isset($_COOKIE['password'])) {
        $password = $_COOKIE['password'];
    } else {
        // присваиваем $password значение '' если $_COOKIE['password'] равен NULL
        $password = '';
    }

    if (checkAuth($login, $password)) {
        header('Location: /autorization/index.php');
    }
ivashkevich

Отлично

dom1r

В комментариях уже прочитал, что проверку куки можно опустить и в принципе unset тоже, но:

<?php
//logout.php
if (isset($_COOKIE['login'])) {
    unset($_COOKIE['login']);
    unset($_COOKIE['password']);
    setcookie('login', null, -1, '/');
    setcookie('password', null, -1, '/');
    header('Location: /index.php');
} else {
    return false;
}

Сначала просто проверял isset-ом далее редиректил, в комментариях вышел прочел, подправил:

//login.php
if (isset($_COOKIE['login']) && isset($_COOKIE['password'])) {
    require __DIR__ . '/auth.php';
    $login = $_COOKIE['login'];
    $password = $_COOKIE['password'];

    if (checkAuth($login, $password)) {
        header('Location: /index.php');
    }

}

Также не понятные языковые конструкции вроде этих:

function getUserLogin(): ?string

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

Также и здесь:

$loginFromCookie = $_COOKIE['login'] ?? '';
ivashkevich

Вот это бессмысленно:

    unset($_COOKIE['login']);
    unset($_COOKIE['password']);

Вопросительный знак означает, что помимо строки может вернуться null.

function getUserLogin(): ?string

?? - null coalescing operator. Если перед ним null - то вернет значение из правой части, иначе - значение слева.

$loginFromCookie = $_COOKIE['login'] ?? '';
RusTaylor
if (!empty($_COOKIE['login'] && !empty($_COOKIE['password']))){
        $login = $_COOKIE['login'];
        $password = $_COOKIE['password'];
        if (checkAuth($login,$password)){
            header('Location:/index.php');
        }
    }

У меня вот такая проверка куки получилась,только при переходе в login.php всё равно требует вводить пароль, хотя куки есть

ivashkevich

Проверьте дебаггером, где ошибка.

RusTaylor

В панели разработчика пишет что не даёт куки файлам вставить пароль и логин

ivashkevich

Напиши в личку в ВК или Телеге.

ivashkevich

Ниже Вам подсказали)

Bogdan
if (!empty($_COOKIE['login'] && !empty($_COOKIE['password']))){

а здесь все ок? скобки правильно расставлены?

ivashkevich

Именно здесь ошибка)

ArtemijeKA
  1. logout.php

    setcookie('login', '', -1, '/');
    setcookie('password', '', -1, '/');
    /**
    * У меня папка этого задания называется 23 в локальном сервере webshake, то есть webshake/23
    * по этому я сначала ставлю / после logout.php а потом поднимаюсь до дирректории повыше ../ и перехожу в index.php
    */
    header("Location: " . $_SERVER['REQUEST_URI'] . "/../index.php");
  2. В начале login.php добавил:

    require __DIR__ . '/auth.php';
    if (isset($_COOKIE['login']) && isset($_COOKIE['password'])) {
        if (checkAuth($_COOKIE['login'], $_COOKIE['password'])) {
            header('Location: ' . $_SERVER['REQUEST_URI'] . '/../index.php');
        }
    }

Сначала переписал на require_once потом понял, что там еще подключается usersDB и если там данные изменятся то не получится авторизоваться и исправил этот косяк за собой.

ivashkevich

Можно просто Location: /index.php
И для первого и для второго случаев. А так - норм.

ArtemijeKA

Я забыл написать у меня локальный сервер webshake а папка с заданием 23 и того webshake/23/ по этому если я напишу "Location: /index.php" то перекинет на webshake.

Benya
<?php
setcookie('login', $login, time()-3600, '/');
setcookie('password', $password, time()-3600, '/');
header('Location: /index.php');
ivashkevich

Норм!

Benya
<?php
require __DIR__ . '/auth.php';
$login = getUserLogin();

if  ($login === null) {
    if (!empty($_POST)) {

        $login = $_POST['login'] ?? '';
        $password = $_POST['password'] ?? '';

        if (checkAuth($login, $password)) {
            setcookie('login', $login, 0, '/');
            setcookie('password', $password, 0, '/');
            header('Location: /index.php');
        } else {
            $error = 'Ошибка авторизации';
        }

    }
}else {
    header('Location: /index.php');
}
?>
ivashkevich

Отлично!

SBTesla
<?php
//проверяем переданны ли данные и подключаем файл авторизации
if (!empty($_POST)) {
     require __DIR__ . '/auth.php';

     //заносим переданые данные в переменные
     $login = $_COOKIE['login'] ?? '';
     $password = $_COOKIE['password'] ?? '';

     /*проверяем попали ли данные в куки и какие, устанавливаем
     время жизни и директорию*/
     if (checkAUth($login, $password)) {
          setcookie('login', $login, 0, '/');
          setcookie('password', $password, 0, '/');
          header('location: index.php');
     } else {
          $error = 'Ошибка Авторизации';
     }

}

?>

2

<?php
/* удаление cookie , устанавливаем время 
и направляем пользователя на главную страницу
*/
setcookie('login', $login, time() -3600, '/');
setcookie('password', $password, time()-3600, '/');
header('location: /index.php');
ivashkevich
  1. нужно проверять не $_POST а $_COOKIE
  2. 100 секунд может не хватить, лучше сразу на час назад отбрасывать, если у пользователя косяки со временем
SBTesla

Ага сори поправил,а 100 секунд посоветовали на стаке поставить сказали что ставить на час это костыли, вобще в идеале говорили про -1, но я не совсем понял про -1

ivashkevich

Перечитайте домашку и посмотрите что вы делаете - проверяете наличие куки, а потом данные POST-запроса - это не имеет смысла.

antoxa

Добрый день! Спасибо за урок, возник вопрос, ответь пожалуйста с точки зрения максимальной безопасности.
Сгенерировали auth_token, записали его в базу при входе на сайт и в куки к пользователю.
Дальше при повторном посещении сайта пользователем, сравниваем этот токен и если он совпадает с тем что в базе, логинем пользователя.
Допустим этот токен крадут, вставляют себе в куки и посещают сайт. Происходит логин уже поддельного пользователя.
Как должен выглядеть алгоритм правильно и безопасно чтоб даже если украдут куки не смогли войти?

ivashkevich

Самый простой вариант - сохранять в базу еще и IP, для которого этот токен создавался. Но есть и более изощренные способы защиты. Стоит устанавливать на сайте SSL-сертификат и cookie передавать только по зашифрованному каналу. Еще стоит запретить куки для JS - всё это можно сделать с помощью setcookie - почитайте документацию по этой функции.

antoxa

Спасибо за ответ.
Проверять IP будет плохо для пользователя, он может меняться.
Целый день гуглил сегодня)
В итоге вот к чему пришел: При логине через логин пароль, генерируем токен и пишем в куки и в базу, так же пишем user agent в базу.
При повторном заходе смотрим есть ли токен в куках, если есть, ищем такой в базе, если находим, то сравниваем user agent если все совпадает, то логинем пользователя, ставим переменную в сессию и обновляем токен.
++ как Вы сказали SSL и httponly в true.

Поправьте пожалуйста если что не так)

ivashkevich

В целом - лучше. Но вообще - если будут красть куки, то подделать UserAgent - вообще не проблема. Потому что куки всегда крадутся через какой-нибудь сторонний ресурс, получить на этом ресурсе юзерагент - вообще не проблема. Продвинутые защищенные системы могут строиться на совокупности сразу нескольких характеристик - UserAgent, расширение экрана, язык и версия системы, IP, и еще куча всего.

antoxa

Тут смысл в том что при логине пользователя токен поменяется.
И куками можно воспользоваться пока токен не поменялся.
Плюс на сколько я понял при использовании SSL куки можно украсть только в зашифрованном виде, верно?

ivashkevich

Нет. Украсть куки можно не только перехватом трафика между пользователем и сайтом. Есть XSS атаки. Если интересуетесь темой безопасности, можете прочитать вот эту вводную статью =)

lordbear53@gmail.com

1)

if(!empty($_COOKIE)) {
    setcookie('login', $login, 1, '/');
    setcookie('password', $password, 1, '/');
    header('Location: login.php');
}

2)

if(!empty($_COOKIE)){
    header('Location: index.php');
}
ivashkevich
  1. Что будет, если я зайду на страничку логаута, не будучи залогиненным?
  2. Наличие куки еще не значит, что пользователь авторизован! Нужна нормальная проверка того, что в куки пришло.
demyanovpaul@yandex.ru

Создайте страницу для разлогинивания - logout.php. При переходе на неё должны удаляться cookie с ключами login и password и выполняться редирект на главную страницу. В качестве ответа предоставьте полный код файла logout.php.

<?php
setcookie('login','0',time() - 3600);
setcookie('password','0',time() - 3600);
header('Location: index.php');

Сейчас при переходе авторизованного пользователя на страницу login.php открывается форма авторизации. Сделайте предварительную проверку того, что пользователь уже авторизован. И если он является авторизованным, перенаправляйте его на главную страницу. В качестве ответа на это задание предоставьте только код, который вы добавили в файл login.php.

<?php
//Задание 2
if(!empty($_COOKIE['login']) && !empty($_COOKIE['password'])){
    header('Location: index.php');
}

if (!empty($_POST)) {
    require __DIR__ . '/auth.php';

    $login = $_POST['login'] ?? '';
    $password = $_POST['password'] ?? '';

    if (checkAuth($login, $password)) {
        setcookie('login', $login, 0, '/');
        setcookie('password', $password, 0, '/');
        header('Location: /index.php');
    } else {
        $error = 'Ошибка авторизации';
    }
}
?>
<html>
<head>
    <title>Форма авторизации</title>
</head>
<body>
<?php if (isset($error)): ?>
    <span style="color: red;">
    <?= $error ?>
</span>
<?php endif; ?>
<form action="/login.php" method="post">
    <label for="login">Имя пользователя: </label><input type="text" name="login" id="login">
    <br>
    <label for="password">Пароль: </label><input type="password" name="password" id="password">
    <br>
    <input type="submit" value="Войти">
</form>
</body>
</html>
ivashkevich

Для заголовка Location лучше указывать абсолютный путь:

Location: /index.php

Так точно перенесет на index.php в корне сайта.

if(!empty($_COOKIE['login']) && !empty($_COOKIE['password'])){
    header('Location: index.php');
}

Наличие Cookie в браузере ещё не означает, что пользователь авторизован. Если они есть, нужно их еще проверить.

demyanovpaul@yandex.ru
if(!empty($_COOKIE['login']) && !empty($_COOKIE['password'])){
    if(checkAuth($_COOKIE['login'], $_COOKIE['password'])){
        header('Location: /index.php');
    }
}

Спасибо, поправил.

ivashkevich

Хорошо. После отправки header-а location можно сразу завершить работу скрипта с помощью die().

virtual2018

Неплохое задание, единственная претензия, что используются конструкции, которые хоть и имеют общую тему с уже пройденным материалом, но я думаю требуют некоторого акцента на них:
1) такая строка кода: function checkAuth(string $login, string $password): bool
начиная с версии PHP7 позволяет указать нам тип возвращаемого значения функции (аналогичны мы использовали типизацию входных данных при изучении функций). И по аналогии при использовании _declare(stricttypes=1) мы сможем включить строгую типизацию.
2) строка: function getUserLogin(): ?string как уже отвечал автор курса, указывает что возвращаемое значение может быть или строкой или NULL.
текст ссылки
3) строка: $loginFromCookie = $_COOKIE['login'] ?? '', это еще одно нововведение 7 версии,
можно назвать другой записью тернарного оператора, но более правильно Оператор объединения с null (null coalescing), логика простая - "Выражение (expr1) ?? (expr2) вычисляется так: expr2, если expr1 равен NULL и expr1 в противном случае"
текст ссылки
1 задание

<?php
setcookie('login', '', 0, '/');
setcookie('password', '', 0, '/');
header('Location: /index.php');

2 задание

if (!empty($_COOKIE)) {
    require __DIR__ . '/auth.php'; 
    if (isset($_COOKIE['login']) && isset($_COOKIE['password'])) {
        if (checkAuth($_COOKIE['login'], $_COOKIE['password'])) {
            header('Location: /index.php');
        }
    }
}
ivashkevich

Отличное дополнение!

avansis1

Ввожу верные логин/пароль - выдается следующая ошибка:
Parse error: syntax error, unexpected '?' in C:\OSPanel\domains\myproject.loc\www\auth.php on line 14

Памагите(

ivashkevich

Переводить ошибку пробовали?

avansis1

Да, уже решил, где то выше описание было)

7vs13@inbox.ru
require __DIR__.'/authorization.php';
if (!empty($_COOKIE['login']) && !empty($_COOKIE['password']) &&
    checkInvUser($_COOKIE['login'], $_COOKIE['password']))
   {
    header('Location: /index.php');
   }
ivashkevich

Правильно.

Bogdan

Создайте страницу для разлогинивания - logout.php. При переходе на неё должны удаляться cookie с ключами login и password и выполняться редирект на главную страницу. В качестве ответа предоставьте полный код файла logout.php

setcookie('login', '', 1, '/');
setcookie('password', '', 1, '/');
header('Location: /index.php');

Сейчас при переходе авторизованного пользователя на страницу login.php открывается форма авторизации. Сделайте предварительную проверку того, что пользователь уже авторизован. И если он является авторизованным, перенаправляйте его на главную страницу. В качестве ответа на это задание предоставьте только код, который вы добавили в файл login.php.

if (isset($_COOKIE['login'])
        && isset($_COOKIE['password'])) {
        header('Location: /index.php');
    }
ivashkevich
  1. ОК
  2. Наличие cookie в браузере еще не означает, что пользователь авторизован.
Bogdan

на счет второго задания, где я мыслю не правильно. Как я видел задание. У нас есть страница авторизации, человек вводит свои данные, проходит авторизацию, куки с паролем и логином сохранились. Дальше он закрывает браузер заходит снова на нужный сайт, и я просто поднимаю его куки с паролем и логином, хотя вот тут коненчо можно повторную проверку запилить на совпадение пароля и логина с куки с теми что в базе... наверное вот эту проверку мне и стоило сделать)) Сам ответил на свой вопрос

ivashkevich

Всё именно так)

N9PIX

1)

<?php
if (empty($_POST)) {
    setcookie('login', $login, -10, '/');
    setcookie('password', $login, -10, '/');
    $login = $_COOKIE['login'] ?? '';
    $password = $_COOKIE['password'] ?? '';
    if (empty($_POST)) {
        header('Location: index.php');
    }
}

2) Не справился. Но разобрал код не буду кидать, взял с коментов
Иван, здесь вы подключаете версию 7.0, а для работы используется уже 7.1. (Методом тыка исправил ошибку с ?string)

ivashkevich

Привет.
1) На страничке для разлогинивания не должно быть POST-запроса. Это простой GET-запрос. В качестве значений куки login и password стоит указать пустые строки, а не логин (зачем?). Кроме того, if с таким же условием внутри другого if - это бессмысленная проверка. Если выполнится первый, то и второй пройдет.
2) Хорошо, что разобрался. P.S. Меня зовут Артём)

excent63

Добрый день! Спасибо за очередной урок:
1 задание:

<?php
require __DIR__ . '/auth.php';
if(isset($_COOKIE)) {
    $login = setcookie('login');
    $password = setcookie('password');
    header('location: /index.php');
}

В index:

<? if ($login !== null):?>
        Добро пожаловать, <?=$login?>!
            <form action="/logout.php" method="post">
                <input type="submit" value="Выйти">
            </form>
ivashkevich

Привет. isset($_COOKIE) - не показывает того, авторизован ли пользователь.

excent63

А так?
1
В logout.php

if(!empty($_COOKIE)) {
    $login = setcookie('login');
    $password = setcookie('password');
    header('location: /index.php');
}

2
Вверху login.php

if (!empty($_COOKIE['login']) && !empty($_COOKIE['password'])){
    header('location: /index.php');
}
ivashkevich

Проверка empty и проверка наличия логина и пароля в cookie не означает, что пользователь авторизован. Это можно узнать, только сравнив эти значения с действительными логином и паролем.

Bugaga159

Задание 1

setcookie('login', '');
setcookie('password', '');
header('Location: /index.php');

Задание 2

if(!empty($_COOKIE['login']) && !empty($_COOKIE['password'])){
    require __DIR__ . '/auth.php';
    $login = $_COOKIE['login'];
    $password = $_COOKIE['password'];
    if (checkAuth($login, $password)){
        header('Location: /index.php');
    }
}
ivashkevich

ОК!

excent63

Наконец то понял какую именно нужно проводить проверку. Вроде этот код отрабатывает как нужно , спасибо за разъяснение !!!

if (!empty($_COOKIE['login']) && !empty($_COOKIE['password'])){
        require __DIR__ . '/auth.php';
        $login = $_COOKIE['login'];
        $password = $_COOKIE['password'];
    if(checkAuth($login, $password)){
        header('location: /index.php');
    }
}
red.shuhov48@gmail.com
<?php
    require __DIR__ .'/login.php';
    setcookie('login', '', 0, '/');
    setcookie('password', '', 0, '/');
    header('Location: /index.php');
?>
ivashkevich

Чет не работает.

ivashkevich

Никогда не изменяйте значения элементов служебных массивов!

Fellini

Logout

<?php
setcookie('login', FALSE);
setcookie('password',FALSE);
header('Location: /index.php');

Checking if already logged in

<?php
require __DIR__.'/auth.php';
if (getUserLogin() !== null) {
    header ('Location: /index.php');
ivashkevich

ОК!

sergey-nv@mail.ru

А можете дать код в файле auth.php для версии php 7.0 ? На php 7.2 текущий код работает, а вот на php 7.0 начинает "спотыкаться" об знак вопроса в коде (на 18 строчке в ваших исходниках).

sergey-nv@mail.ru

Или хотя бы подскажите, что значит строчка в auth.php:
function getUserLogin(): ?string
У вас в 9 уроке нашел справку только по такому синтаксису:
условие ? результат_если_true : результат_если_false
Но в вашем auth.php нет ни двоеточия между двумя результатами, ни самих двух результатов.

ivashkevich

Это значит что тип возвращаемого значения либо string, либо null

sergey-nv@mail.ru

Нашел уже в комментариях, что значит "?". Это понятно. Теперь другой вопрос - можно ли код:
function getUserLogin(): ?string
реализовать по-другому, чтобы он работал и в PHP ранее PHP 7.1?

ivashkevich

Можно убрать тип возвращаемого значения. Но вообще, используйте последнюю версию PHP.

sergey-nv@mail.ru

Да, действительно убрал "?string", оставил только "function getUserLogin()", все заработало. Ребят, всем у кого PHP ниже 7.1, выдает ошибку на "?" в файле auth.php, просто уберите "?string", ну и также уберите двоеточие после function getUserLogin(), будет работать.

ashfedor
 первое
if (!empty($_COOKIE)) {
    require __DIR__ . '/auth.php';

    $login = $_COOKIE['login'] ?? '';
    $password = $_COOKIE['password'] ?? '';

    if (checkAuth($login, $password)) {
        setcookie('login', '', -10, '/');
        setcookie('password', '', -10, '/');
        header('Location: /index.php');
    }
} header('Location: /index.php');

второе
if (!empty($_COOKIE)) {
    require __DIR__ . '/auth.php';
    $login = $_COOKIE['login'] ?? '';
    $password = $_COOKIE['password'] ?? '';

    if (checkAuth($login, $password)) {
        header('Location: /index.php');
    }
}
ivashkevich

Отлично

babls2332@gmail.com

logout.php

<?php

setcookie('login', '', -1, '/');
setcookie('password', '', -1, '/');
header('Location: index.php');

login.php

if (isset($_COOKIE['login']) && isset($_COOKIE['password'])) {
    if ($_COOKIE['login'] !== '' && $_COOKIE['password'] !== '') {
        header('Location: index.php');
    }
}
ivashkevich

login: наличие куки с логином и паролем еще не означает, что пользователь авторизован (то есть что они валидные).

babls2332@gmail.com

А как проверить валидность?

ivashkevich

У нас есть функция checkAuth

sergey-nv@mail.ru

И еще все-таки интересно есть ли где-нибудь в интернете справка по такому синтаксису:
function getUserLogin(): ?string
Я не нашел. А что "Вопросительный знак означает, что помимо строки может вернуться null" услышал только от Вас. А вы откуда такой информацией обладаете?

ivashkevich
sergey-nv@mail.ru

Спасибо большое. Сам почему-то не нашел.

Grewi

Первое задание:

require __DIR__.'/auth.php';
setcookie('login',"",time() - 3600,'/');
setcookie('password' ,"",time() - 3600,'/');
header('location:/index.php');

Во втором задании сделал так:

if (!empty($_COOKIE)) {
    require __DIR__ . '/auth.php';
    $log = $_COOKIE['login']??'';
    $pass = $_COOKIE['password']??'';

    if (checkAuth($log, $pass)) {
        $userYes = true;
    }
} else {
    $userYes = false;
}

По логике авторизованный пользователь не должен быть на этой странице, а уж если пришел, то форму авторизации можно скрыть условиями (как в index.php) и вывести ссылку с переходом на другую страницу или предложить разлогиниться.

<!doctype html>
<html lang="en">
<head>
    <title>Вход</title>
</head>
<body>
<?php if ($userYes === false): ?>
<form action="/login.php" method="post">
    <label for="login">Имя пользователя: </label><input type="text" name="login" id="login">
    </br></br>
    <label for="password">Пароль: </label><input type="text" name="password" id="password">
    </br></br>
    <input type="submit" value="Войти">
    <?php echo '</br></br>'.$error.' <a href="/logout.php">Сброс</a>'; ?>
</form>
<?php else: ?>
<p>Вы уже авторизованы </br></br> <a href="/">Перейти на главную</a> </br></br><a href="/logout.php">Выйти</a></p>
<?php endif; ?>
</body>
</html>
ivashkevich

Красава.

XXX

$loginFromCookie = $_COOKIE['login'] ?? ''; Что означают два вопросительных знака подряд?

XXX

Сделал код как у Вас в уроке. Выбивают ошибку Parse error: syntax error, unexpected '?' in W:\domains\myproject.loc\www\auth.php on line 17.

После удаление знака вопроса в 17 строке кода выбивает следующую ошибку.

Fatal error: Uncaught TypeError: Return value of getUserLogin() must be of the type string, null returned in W:\domains\myproject.loc\www\auth.php on line 26
( ! ) TypeError: Return value of getUserLogin() must be of the type string, null returned in W:\domains\myproject.loc\www\auth.php on line 26
Call Stack
#   Time    Memory  Function    Location
1   0.0001  343664  {main}( )   ...\index.php:0
2   0.0003  344808  getUserLogin( ) ...\index.php:3
Dump $_SERVER
$_SERVER['REMOTE_ADDR'] =
string '127.0.0.1' (length=9)
$_SERVER['REQUEST_METHOD'] =
string 'GET' (length=3)
Dump $_SESSION
$_SESSION['*'] =
undefined
Dump $_REQUEST

После удаления типа стринг возращаемого значения функции в 17 строке все работает.

ivashkevich

А зачем вы удалили знак вопроса, не разобравшись для чего он? =)
https://www.php.net/manual/ru/migration71.new-features.php

Boodoo

logout.php

<?php
    $login = $_COOKIE['login'];
    $password = $_COOKIE['password'];

    setcookie('login', $login, time() - 10, '/');
    setcookie('password', $password, time() -10, '/');
    header('Location: /');

login.php

if(!empty($_COOKIE['login'])) {
        header('Location: /');
    }
ivashkevich

Наличие логина в куки еще не означает, что пользователь авторизован. Он с помощью специальных расширений в браузере какие захочет может наставить.

Boodoo

Еще пароль в проверку писать?

ivashkevich

Наличие какого-то пароля в куках ещё не говорит о том, что логин и пароль верные, и пользователь действительно авторизован.

Boodoo
if(!empty($_COOKIE['login']) && !empty($_COOKIE['password'])) {
        require __DIR__ . '/auth.php';
        $login = $_COOKIE['login'];
        $password = $_COOKIE['password'];
        if(checkAuth($login, $password)) {
            header('Location: /');
        }
    }
ivashkevich

Правильно

Dram

Ну и ладно, что убил на это целый день, зато решил :))

<?php

$array = require __DIR__ . '/usersDB.php';
$a = $_COOKIE['password'];
$b = $_COOKIE['login'];
foreach ($array as $password) {
    if ($password['password'] === $a && $password['login']===$b){

        header('Location: /index.php');
    }
}
ivashkevich

Нужно проверить сначала, есть ли в $_COOKIE такой ключ, прежде чем использовать.

Dram

Не совсем понял - в чем ошибка?

ivashkevich

Если в массиве не будет одного из ключей, то при обращении по нему будет ошибка

Dram

Все равно не понимаю вашу мысль.

  1. Мы проверяем валидность логина и пароля из куки. Если все ок - редирект на главную.
  2. Если логин или пароль не совпадают - просто предложение к авторизации остается.
    Я сейчас специально авторизовался и затем опять перешел на страницу логина - получил редирект. Тут же меняю логин в куке на заведомо неверный - иду на страницу логина и меня просят авторизоваться.
    Так в чем ошибка?

P.S. это же только верхняя часть всего кода файла логин....

ivashkevich

Ещё раз говорю - при обращении к значению массива по несуществующему ключу будет ошибка.

Dram

Приведите пожалуйста пример, ну не догоняю я :(

artemship

Задание 1:

<?php
setcookie('login', '', time() - 3600, '/');
setcookie('password', '', time() - 3600, '/');
header('Location: /index.php');

Задание 2:

<?php
require __DIR__ . '/auth.php';
$login = getUserLogin();

if ($login !== null) {
    header('Location: /index.php');
} else {
    if (!empty($_POST)) {
        $login = $_POST['login'] ?? '';
        $password = $_POST['password'] ?? '';
        if (checkAuth($login, $password)) {
            setcookie('login', $login, 0, '/');
            setcookie('password', $password, 0, '/');
            header('Location: /index.php');
        } else {
            $error = 'Ошибка авторизации';
        }
    }
}
ivashkevich

Отлично!

krollik1000000@gmail.com
if (!empty($_COOKIE)) {
      setcookie('login',$login,-10,'/');
      setcookie('password',$password,-10,'/');
      header('Location:/index.php');
  }
if (!empty($_COOKIE)) {
    header('Location: /index.php');
}
ivashkevich

Наличие куки ещё не говорит о том, что пользователь авторизован.

krollik1000000@gmail.com

То есть мне надо писать если $-Cookie[login] = user то тогда перекидывать на главную ну и пароль так же или сравнивать с переменными $login и $password

ivashkevich

У вас для этого есть готовая функция уже. Только перед ее вызовом нужно проверить, что в куках действительно есть эти значения.

krollik1000000@gmail.com
f (!empty($_COOKIE)) {
    require __DIR__ . '/auth.php';
    $login = $_COOKIE['login'];
    $password = $_COOKIE['password'];
    if (checkAuth($login,$password)) {
        header('Location: /index.php');
    }
}

долго думал но наконец до меня дошло как это сделать

ivashkevich

Опять не проверяете массив на наличие ключей! Нельзя быть уверенным что здесь

$_COOKIE['login']

что-то есть. Рискуете нарваться на ошибку каждый раз. Устал уже писать об одном и том же.

krollik1000000@gmail.com

Всмысле? Я же проверяю если куки не пустой то пишу проверку логина и пароля

ivashkevich

Нет проверки на то, что в массиве $_COOKIE вообще есть ключ login или password.

Moskva

Разлогинивание:

if(!empty($_COOKIE)){
    setcookie('login', '',  - 1, '/');
    setcookie('password', '',  - 1, '/');
    header('Location:/index.php');
}

Проверка авторизации:

require __DIR__ . '/auth.php';
if(!empty($_COOKIE)){
    $login = $_COOKIE['login'] ?? '';
    $password = $_COOKIE['password'] ?? '';
    if(checkAuth($login, $password)){
        header('Location: /index.php');
    }
}
ivashkevich

Про разлогинивание - наличие данных в куки, еще не означает, что пользователь авторизован. Мало ли, чего он там себе напихал в записи.

Moskva

Значит просто их удалить?

<?php
    setcookie('login', '',  - 1, '/');
    setcookie('password', '',  - 1, '/');
    header('Location:/index.php');
?>
ivashkevich

Нет. Это значит, что нужно убедиться, что он действительно авторизован.

esqrx

//1


<?php

if (isset($_COOKIE)) {
    setcookie('login', $login, -1, '/');
    setcookie('password', $password, -1, '/');
    header('Location: /index.php');
} else {
    header('Location: /index.php');
}
ivashkevich

(isset($_COOKIE)) - всегда вернёт true

esqrx

//2

require __DIR__ . '/auth.php';
if (isset($_COOKIE)) {
    $login = $_COOKIE['login'] ?? '';
    $password = $_COOKIE['password'] ?? '';
    if (checkAuth($login, $password)) {
        header('Location: /index.php');
    }
}
ivashkevich

Всё ок, кроме той же ошибки, что и выше

bratko

У меня вопрос по данному коду:

<?php
require __DIR__ . '/auth.php';
$login = getUserLogin();
?>
<html>
<head>
    <title>Главная страница</title>
</head>
<body>
<?php if ($login === null): ?>
<a href="/login.php">Авторизуйтесь</a>
<?php else: ?>
Добро пожаловать, <?= $login ?>
<br>
<a href="/logout.php">Выйти</a>
<?php endif; ?>
</body>
</html>

Я не пойму, как в данном случае скрываются те или иные строки html, вот ты прописал:

<?php if ($login === null): ?>

и выводится именно это:

<a href="/login.php">Авторизуйтесь</a>

Мы же получается пишем обычный html код уже за пределами <?php ?> и как он улавливает данные условия?

bratko

Просто я для себя представлял правильным примерно так:

<body>

<?php

if ($login === null){
    echo '<a href="/login.php">Авторизуйтесь</a>';
} else {
    echo 'Добро пожаловать' . $login . '<br>' . '<a href="/logout.php">Выйти</a>';
}

?>
</body>

и понимал как работает, а по твоему коду не совсем понял, но походу просто надо это запомнить и выучить что так тоже можно и всё?

ivashkevich

Да. Так просто можно и это надо запомнить.

Bizzzon

1

unset($_COOKIE);
header("Location: /login.php");

Файл logout.php
2

<?php
if (!empty($_POST)) {
    require __DIR__ . '/auth.php';
    $login = $_POST['login'] ?? '';
    $password = $_POST['password'] ?? '';
    if (checkAuth($login, $password)) {
        setcookie('login', $login, 0, '/');
        setcookie('password', $password, 0, '/');
        header('Location: /index.php');
    } else {
        $error = 'Ошибка авторизации';
    }
} else{
    header("Location /index.php");
}

?>
ivashkevich
  1. Зачем все куки удалили? Нужно только login и password.
  2. Задание совсем другое. У вас страница логина не работает, просто отправляет на главную.
AlexxxEy

Удаление

setcookie("login", $login, time()-3600);
setcookie("password", $password, time()-3600);
header('Location:/index2.php');

Проверка

require __DIR__ . '/auth.php';
if(!empty($_COOKIE['login']) && !empty($_COOKIE['password']))
{ if (checkAuth($_COOKIE['login'], $_COOKIE['password'])){
    header('Location:/index2.php');
}
}
ivashkevich
  1. Для чего в качестве значений куки устанавливаются значения переменных?
kvakazuabr
1
if (!empty($_COOKIE)) {
        require __DIR__ . '/auth.php';

        setcookie('login', $login, '/');
        setcookie('password', $password, '/');
        header('Location: /index.php');
    }
2
if(!isset($_COOKIE)) {
    require __DIR__ . '/auth.php';

    $login = $_COOKIE['login'] ?? '';
    $password = $_COOKIE['password'] ?? '';

    if(checkAuth($login, $password)) {
      header('Location: /index.php') ;
    }  
}
ivashkevich
  1. Наличие cookie ещё не означает, что пользователь авторизован.
    require __DIR__ . '/auth.php';

    Файл для чего подключаете? Там ведь только функция.

        setcookie('login', $login, '/');
        setcookie('password', $password, '/');

    Откуда взяться переменным $login и $password? Будет ошибка.
    Бред полный.

  2. Вообще непонятно что. Читаем по строкам:
    if(!isset($_COOKIE)) {

    Если куки нет, то...

    $login = $_COOKIE['login'] ?? '';

    Пытаемся взять значение из куки.
    Бред! Переделывайте. Хоть бы проверили, что работает, перед тем как отправлять это сюда.

Blook

Logout (Исправил код, убрав проверку на наличие кук в теге body)

<?php 
    require __DIR__ . '/auth.php';

    if (!empty($_COOKIE)) {
        $loginFromCookie = $_COOKIE['login'] ?? '';
        $passwordFromCookie = $_COOKIE['password'] ?? '';

        if(isAuth($loginFromCookie, $passwordFromCookie)) {
            setcookie('login', '', time() - 3600, '/');
            setcookie('password', '', time() - 3600, '/');
            header('Location: index.php');
        }
    }
?>
<html>
<head>
    <title>logout</title>
</head>
<body>
    <p>Вы не авторизованы.</p>
</body>
</html>    

login

if (!empty($_COOKIE)) {
    require __DIR__ . '/auth.php';
    $loginFromCookie = $_COOKIE['login'] ?? '';
    $passwordFromCookie = $_COOKIE['password'] ?? '';

    if(isAuth($loginFromCookie, $passwordFromCookie)) {
        header('Location: index.php');
    }
}
ivashkevich
    <?php if(empty($_COOKIE)):?>
    <p>Вы не авторизованы.</p>
    <?php endif ?>

Пользователь может быть неавторизованным, даже если куки у него есть. Например, если данные в куках неправильные

Blook

поправил

ivashkevich

Супер!

denis_vsalda@mail.ru

в logout.php

<?php

setcookie('login', '', time() - 1, '/');
setcookie('password', '', time() - 1, '/');
header('Location: /index.php');

?>

А в index.php если пользователь авторизован добавил ссылку на Logout.php

<?php if ($login != null): ?>
            Добро пожаловать, <?= $login ?>
            <br><br>
            <a href="/logout.php">Выйти</a>
        <?php else: ?>
            <a href="/login.php">Авторизуйтесь</a>
        <?php endif; ?>

Проверка:

if (!empty($_COOKIE)) {
    require __DIR__ . '/auth.php';
    $login = $_COOKIE['login'];
    $password = $_COOKIE['password'];
    if (checkAuth($login, $password)) {
        header('Location: /index.php');
    }
}
ivashkevich

Отлично!

Vladimir96
//Первое задание: logout.php
    setcookie('login', $_COOKIE['login'], time() - 1, '/');
    setcookie('login', $_COOKIE['password'], time() - 1, '/');
    header('Location: /index.php');
//Второе задание: login.php добавил в начало кода 
    $userIsAuthor = require __DIR__ . '/usersDB.php';

    $checkLogin = $_COOKIE['login'] ?? '';
    $checkPassword = $_COOKIE['password'] ?? '';

    foreach ($userIsAuthor as $value) {
        if ($checkLogin === $value['login'] && $checkPassword === $value['password']) {
            header('Location: /index.php');
        }
    }
ivashkevich

На странице с логаутом не нужно проверять ничего. Сейчас у вас если туда незалогиненный пользователь зайдет, он там останется.
Во втором задании как раз надо проверять. Перечитайте задание и переделайте всё.

Vladimir96

Первое задания исправил. Спасибо)
Второе задание не понял, что там поправлять?
Я действовал по такой логике:
1) Проверил наличие куки и вложил в переменную.
2) И если две эти переменные true, то перевожу на страницу index.php.

ivashkevich

Во втором задании наличие куки ещё не означает что пользователь авторизован. Я могу прямо в хроме у себя любые куки насоздавать.

Vladimir96

Поправил, посмотрите пожалуйста)

ivashkevich

$userIsAuthor as $value - плохие имена переменных. Абсолютно не отражают того, что в них на самом деле хранится.

Vladimir96

окей понял, кстати случайно обнаружил, что в logout.php все таки нужна проверка, иначе если пользователь нажимает правую кнопку мыши на ссылку рарзлогинивания в index.php, то может из выпадающего меню выбрать "Копировать адрес ссылки", вставить ссылку в браузер, перейти на logout.php и ему выдаст кучу ошибок, так как не было проверки.
Я оформил вот так, если пользователь не залогинен, то его перебросит на login.php

    $_COOKIE['login'] = $_COOKIE['login'] ?? '';
    $_COOKIE['password'] = $_COOKIE['password'] ?? '';

    setcookie('login', $_COOKIE['login'], time() - 1, '/');
    setcookie('login', $_COOKIE['password'], time() - 1, '/');
    header('Location: /index.php');
ivashkevich

Так, стоп. Нафига туда текущее значение куки передавать? Для разлогинивания надо их убрать. Передав null, например.

Vladimir96

туда это куда?

ivashkevich
setcookie('login', $_COOKIE['login'], time() - 1, '/');

Для логаута. Передавать в куки в качестве значения текущее значение куки - ерунда какая-то. Передавай туда null.

Vladimir96

нихера себе подробность)) теперь все сошлось, спасибо) я и понятия не имел, что можно null передать)

Dreft

Задача 1.

<?php
setcookie('login', '', time() - 30 * 24 * 60 * 60, '/');
setcookie('password', '', time() - 30 * 24 * 60 * 60, '/');
header('Location: /');

Задача 2.

<?php
require __DIR__ . '/auth.php';
if (!empty($_COOKIE['login']) && !empty($_COOKIE['password'])) {
    $login = $_COOKIE['login'];
    $password = $_COOKIE['password'];
    if (checkAuth($login, $password)) {
        header('Location: /index.php');
    }
}
if (!empty($_POST)) {
    $login = $_POST['login'] ?? '';
    $password = $_POST['password'] ?? '';
    if (checkAuth($login, $password)) {
        setcookie('login', $login, time() + 30 * 24 * 60 * 60, '/');
        setcookie('password', $password, time() + 30 * 24 * 60 * 60, '/');
        header('Location: /index.php');
    } else {
        $error = 'Ошибка авторизации';
    }
}
?>
ivashkevich
  1. Что за -0?
  2. Если куки установлены, это ещё не означает что пользователь авторизован. Нужно так же проверить их на валидность.
Dreft

Не понимаю, с чем их сравнивать.

ivashkevich

В checkAuth передать

Dreft

Все, доехал, поправил.

Я почему-то пытался вклинить проверку не туда.

ivashkevich

Ок. Только вместо нуля нужно передавать какое-то нормальное значение. Иначе после закрытия браузера авторизация будет слетать.

Dreft

Поправил.

ivashkevich

Супер

XXX
<?php
setcookie('login', '', -999, '/');
setcookie('password', '', -999, '/');
header('Location: /index.php');
require __DIR__.'/auth.php';
if(null !== (getUserLogin())){
    header('Location: /index.php ');
}
ivashkevich

Ок, только (getUserLogin()) не нужно оборачивать в скобки. И Yoda condition я не одобряю.

AleksandrNenashev

w меня ругается на знак ? в файле \auth.php on line 18 вот сама строка - function getUserLogin(): ?string. Если убираю ? то все работает нормально. Почему так происходит?

XXX

Скорее всего ты используешь старую версию php

ivashkevich

Нужна более новая версия php

AleksandrNenashev
<?php
if (!empty($_COOKIE)) {
    require __DIR__ . '/auth.php';

    $login = $_COOKIE['login'] ?? '';
    $password = $_COOKIE['password'] ?? '';

    if (checkAuth($login, $password)) {
        header('Location: /index.php');
    }
}
?>
AleksandrNenashev

Почему многие указывают в строках setcookie('login', $login, -10, '/'); число -10?

XXX

Число не имеет значение. Если будет со знаком минус куки удалятся.

ivashkevich

Посмотри официальную документацию.

AleksandrNenashev

Значит мой ответ неправильный?

<?php
if (!empty($_COOKIE)) {
    require __DIR__ . '/auth.php';

    $login = $_COOKIE['login'] ?? '';
    $password = $_COOKIE['password'] ?? '';

    if (checkAuth($login, $password)) {
        header('Location: /login.php');
    }
}
?>
ivashkevich

Если пользователь авторизован, то отправить его на страницу авторизации. Бред, конечно.

AleksandrNenashev

Второй код был с изменениями просто не увидел. До него отправил правильный.

shrineofamana

1 задание:

setcookie('login', null, -1, '/');
setcookie('password', null, -1, '/');
header('refresh: 1; url=index.php');

2 задание:

require_once __DIR__ . '/auth.php';
$login = $_COOKIE['login'] ?? '';
$password = $_COOKIE['password'] ?? '';
if (checkAuth($login, $password)) {
    header('location: /index.php');
}

Во втором задании столкнулся с несколькими ошибками, было интересно их решить и почитать заодно документацию.

ivashkevich
if (checkAuth($login, $password)): {
    header('location: /index.php');
}
endif;

Это синтаксис для шаблонов. В коде его не используют.

shrineofamana

Спасибо, исправлено.

ivashkevich

В комментарии ничего не изменилось

Ooleg

logout.php

<?php
setcookie('login', '', time() - 1, '/');
setcookie('password', '', time() -1, '/');
header('Location: /index.php');

добавил в login.php

require __DIR__ . '/auth.php';
$loginFromCookie = $_COOKIE['login'] ?? '';
$passwordFromCookie = $_COOKIE['password'] ?? '';

if (checkAuth($loginFromCookie, $passwordFromCookie)) {
    header('Location: /index.php');
}
ivashkevich

Отлично

prinzplanloser0514@gmail.com
 $login = $_POST['login'] ?? '';
    $password = $_POST['password'] ?? '';

Что за два вопроса после логина и пароля ?

dliashchenko

logout.php

<?php
unset($_COOKIE['login'], $_COOKIE['password']);
setcookie('login', null, -1, '/');
setcookie('password', null, -1, '/');
header('location: /login.php');

login.php

<?
function redirectIndex() {
    header('Location: /index.php');
}

if (isset($_COOKIE['login'], $_COOKIE['password'])){
    redirectIndex();
}

Исправил на:

$loginFromCookie = $_COOKIE['login'] ?? '';
$passwordFromCookie = $_COOKIE['password'] ?? '';

if (checkAuth($loginFromCookie, $passwordFromCookie)){
    header('Location: /index.php');
}

вынес в начало login.php

<?
require __DIR__.'/auth.php';

из условия

if (!empty($_POST)){
   ...
}
ivashkevich

Если куки установлены, это ещё не означает что пользователь авторизован. Нужно так же проверить их на валидность.

H3licoptero
Первое задание.

if (!empty($_COOKIE['login']) && !empty($_COOKIE['password'])) {
    setcookie('login', '', time() -3600,'/');
    setcookie('password', '', time() -3600, '/');
    header('Location: /index.php');
}

Второе задание.

if (!empty($_COOKIE['login']) && !empty($_COOKIE['password'])) {
    require __DIR__ . '/auth.php';
    $login = $_COOKIE['login'];
    $password = $_COOKIE['password'];
    if (checkAuth($login, $password)) {
        header('Location: /index.php');
    }
}
ivashkevich

Супер

Death4el

От нечего делать добавил кнопку регистрации,защита от повторного ника,защита от пасса<5 символов,переписал БД на текстовик(ибо пока не подходил к работе с бд,сори за ужасный код )

reg.php
<?php

if (!empty($_POST))
{
    $checker=true;
    $secondChecker=true;
    $newLogin = $_POST['newLogin'];
    $newPassword = $_POST['newPassword'];
    if(iconv_strlen($newPassword)<6)
    {
        $error = 'Пароль должен быть больше 5-ти символов!';
        $checker=false;
        $secondChecker=false;
    }

    $fp = fopen("bd.txt", "r");
    if (($fp) && ($secondChecker))
    {
        while (!feof($fp))
        {
            $mytext = fgets($fp, 999);
            $checkar = explode(" ", $mytext);
            $max=sizeof($checkar);
            for($i=0;$i<$max;$i++)
            {
                $check=explode(":",$checkar[$i]);
                if($check[0]==$newLogin)
                {
                    $error = 'Такой логин уже существует';
                    $checker=false;
                    break;

                }

            }
        }
    }
    fclose($fp);

    if($checker)
    {
        $fp = fopen("bd.txt", "a");
    $mytext = "{$newLogin}:{$newPassword} "; // Исходная строка
    $test = fwrite($fp, $mytext); // Запись в файл
    fclose($fp);
    setcookie('login', $newLogin, 0, '/');
    setcookie('password', $newPassword, 0, '/');
    header('Location: /indexlog.php');
    fclose($fp);
}
}

?>

<html>
<head>
    <title>Форма регистрации</title>
</head>
<body>
<?php if (isset($error)): ?>
    <span style="color: red;">
    <?= $error ?>
</span>
<?php endif; ?>
<form action="/reg.php" method="post">
    <label for="newLogin">Введите имя пользователя: </label><input type="text" name="newLogin" id="newLogin">
    <br>
    <label for="newPassword">Введите пароль: </label><input type="text" name="newPassword" id="newPassword">
    <br>
    <input type="submit" value="Регистрация">
</form>
<form action="/loginlog.php">
    <p><button name="">Я вспомнил!</button></p>
</form>
</body>
</html>

функция для парса в форме лог:пас с текстовика(в auth.php)
<?php
function checkAuth(string $login, string $password): bool
{
    $fp = fopen("bd.txt", "r");
    if ($fp)
    {
        while (!feof($fp))
        {
            $mytext = fgets($fp, 999);
            $checkar = explode(" ", $mytext);
            $max=sizeof($checkar);
            for($i=0;$i<$max;$i++)
            {
            $check=explode(":",$checkar[$i]);
            if(($check[0]==$login) && ($check[1]==$password))
            {
                return true;
            }

            }
        }
        }
    fclose($fp);
    return false;
}
ivashkevich

Пойдет, молодец

Онлайн-курсы PHP и MySQL
Обучение с полного нуля до уровня джуниора!
Начать бесплатно
Логические задачи с собеседований