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


fantasyz 31.03.2018 в 02:37

удаление

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 31.03.2018 в 13:40

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

setcookie('login', '', -10, '/');
ivashkevich 03.04.2018 в 18:49

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

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

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

ivashkevich 04.04.2018 в 19:11

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

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

fantasyz 05.04.2018 в 00:46
require __DIR__ . '/auth.php';

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

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

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

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

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

fantasyz 05.04.2018 в 22:11

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

ivashkevich 05.04.2018 в 22:17

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

1nSide 03.05.2018 в 12:24

logout.php

<?php

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

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

ivashkevich 04.05.2018 в 05:55

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

1nSide 03.05.2018 в 12:41

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

ivashkevich 04.05.2018 в 07:29

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

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

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

    return null;
}

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

ivashkevich 12.05.2018 в 09:51

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

arminbuuren86@gmail.com 12.05.2018 в 10:30

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

ivashkevich 12.05.2018 в 13:42

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

arminbuuren86@gmail.com 12.05.2018 в 14:05

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

ivashkevich 12.05.2018 в 15:11

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

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

вот что пишет

Fox-24 14.08.2018 в 19:08

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

<?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 14.08.2018 в 20:46
  1. Можно не проверять перед удалением кукисов:
    if (!empty($_COOKIE['login'])) {
  2. Вот эта строка может накидать warning-ов (которая вне условия):
    $password = $_COOKIE['password'];
Fox-24 14.08.2018 в 22:00
  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 16.08.2018 в 21:45

Отлично

dom1r 18.08.2018 в 16:35

В комментариях уже прочитал, что проверку куки можно опустить и в принципе 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 20.08.2018 в 23:09

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

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

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

function getUserLogin(): ?string

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

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

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

ivashkevich 01.09.2018 в 13:35

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

RusTaylor 04.09.2018 в 20:36

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

ivashkevich 05.09.2018 в 23:25

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

ivashkevich 26.12.2018 в 23:44

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

Bogdan 26.12.2018 в 16:14
if (!empty($_COOKIE['login'] && !empty($_COOKIE['password']))){

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

ivashkevich 26.12.2018 в 23:44

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

ArtemijeKA 10.09.2018 в 15:39
  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 10.09.2018 в 23:24

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

ArtemijeKA 11.09.2018 в 16:58

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

Benya 20.09.2018 в 21:11
<?php
setcookie('login', $login, time()-3600, '/');
setcookie('password', $password, time()-3600, '/');
header('Location: /index.php');
ivashkevich 22.09.2018 в 20:28

Норм!

Benya 22.09.2018 в 16:12
<?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 22.09.2018 в 20:29

Отлично!

SBTesla 26.09.2018 в 08:30
<?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 27.09.2018 в 23:10
  1. нужно проверять не $_POST а $_COOKIE
  2. 100 секунд может не хватить, лучше сразу на час назад отбрасывать, если у пользователя косяки со временем
SBTesla 28.09.2018 в 09:13

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

ivashkevich 28.09.2018 в 09:18

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

antoxa 24.10.2018 в 08:50

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

ivashkevich 26.10.2018 в 08:52

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

antoxa 26.10.2018 в 22:05

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

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

ivashkevich 26.10.2018 в 22:10

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

antoxa 27.10.2018 в 09:00

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

ivashkevich 27.10.2018 в 15:20

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

CarfikDK 31.10.2018 в 12:24

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 01.11.2018 в 22:51
  1. Что будет, если я зайду на страничку логаута, не будучи залогиненным?
  2. Наличие куки еще не значит, что пользователь авторизован! Нужна нормальная проверка того, что в куки пришло.
demyanovpaul@yandex.ru 05.11.2018 в 14:57

Создайте страницу для разлогинивания - 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 05.11.2018 в 21:44

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

Location: /index.php

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

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

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

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

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

ivashkevich 08.11.2018 в 10:32

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

virtual2018 21.11.2018 в 20:15

Неплохое задание, единственная претензия, что используются конструкции, которые хоть и имеют общую тему с уже пройденным материалом, но я думаю требуют некоторого акцента на них:
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 22.11.2018 в 09:40

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

avansis1 23.11.2018 в 17:23

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

Памагите(

ivashkevich 24.11.2018 в 21:45

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

avansis1 25.11.2018 в 08:31

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

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

Правильно.

Bogdan 26.12.2018 в 16:01

Создайте страницу для разлогинивания - 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 26.12.2018 в 23:40
  1. ОК
  2. Наличие cookie в браузере еще не означает, что пользователь авторизован.
Bogdan 27.12.2018 в 20:11

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

ivashkevich 28.12.2018 в 21:09

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

N9PIX 30.01.2019 в 11:26

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 01.02.2019 в 23:40

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

excent63 30.01.2019 в 16:45

Добрый день! Спасибо за очередной урок:
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 01.02.2019 в 23:41

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

excent63 02.02.2019 в 17:21

А так?
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 03.02.2019 в 23:44

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

Bugaga159 01.02.2019 в 20:52

Задание 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 01.02.2019 в 23:42

ОК!

excent63 06.02.2019 в 20:23

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

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 07.02.2019 в 21:40
<?php
    require __DIR__ .'/login.php';
    setcookie('login', '', 0, '/');
    setcookie('password', '', 0, '/');
    header('Location: /index.php');
?>
ivashkevich 07.02.2019 в 21:52

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

ivashkevich 07.02.2019 в 21:53

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

Fellini 07.03.2019 в 17:43

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 09.03.2019 в 19:26

ОК!

sergey-nv@mail.ru 11.03.2019 в 17:30

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

sergey-nv@mail.ru 11.03.2019 в 18:50

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

ivashkevich 11.03.2019 в 21:25

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

sergey-nv@mail.ru 11.03.2019 в 19:10

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

ivashkevich 11.03.2019 в 21:26

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

sergey-nv@mail.ru 12.03.2019 в 07:32

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

ashfedor 11.03.2019 в 19:20
 первое
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 11.03.2019 в 21:27

Отлично

babls2332@gmail.com 11.03.2019 в 19:25

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 11.03.2019 в 21:28

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

babls2332@gmail.com 11.03.2019 в 21:30

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

ivashkevich 11.03.2019 в 21:35

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

sergey-nv@mail.ru 11.03.2019 в 19:29

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

ivashkevich 11.03.2019 в 21:29
sergey-nv@mail.ru 12.03.2019 в 07:34

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

Grewi 21.03.2019 в 01:50

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

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 23.03.2019 в 22:19

Красава.

XXX 24.03.2019 в 23:45

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

XXX 25.03.2019 в 22:59

Сделал код как у Вас в уроке. Выбивают ошибку 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 27.03.2019 в 11:35

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

Boodoo 05.04.2019 в 18:23

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 06.04.2019 в 11:41

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

Boodoo 06.04.2019 в 13:35

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

ivashkevich 06.04.2019 в 13:49

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

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

Правильно

Dram 24.04.2019 в 08:32

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

<?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 25.04.2019 в 07:42

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

Dram 25.04.2019 в 07:44

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

ivashkevich 25.04.2019 в 07:47

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

Dram 25.04.2019 в 08:45

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

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

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

ivashkevich 25.04.2019 в 11:46

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

Dram 25.04.2019 в 11:48

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

artemship 30.04.2019 в 13:17

Задание 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 30.04.2019 в 16:52

Отлично!

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

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

krollik1000000@gmail.com 12.05.2019 в 13:49

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

ivashkevich 12.05.2019 в 15:03

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

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

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

ivashkevich 12.05.2019 в 23:42

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

$_COOKIE['login']

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

krollik1000000@gmail.com 13.05.2019 в 00:24

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

ivashkevich 13.05.2019 в 00:29

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

Moskva 02.06.2019 в 12:01

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

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 03.06.2019 в 18:12

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

Moskva 26.06.2019 в 15:58

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

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

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

esqrx 13.06.2019 в 03:59

//1


<?php

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

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

esqrx 13.06.2019 в 04:26

//2

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

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

bratko 13.06.2019 в 13:21

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

<?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 13.06.2019 в 14:06

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

<body>

<?php

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

?>
</body>

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

ivashkevich 13.06.2019 в 19:44

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

Bizzzon 11.07.2019 в 21:43

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 12.07.2019 в 05:41
  1. Зачем все куки удалили? Нужно только login и password.
  2. Задание совсем другое. У вас страница логина не работает, просто отправляет на главную.
AlexxxEy 19.07.2019 в 01:17

Удаление

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 19.07.2019 в 07:02
  1. Для чего в качестве значений куки устанавливаются значения переменных?
kvakazuabr 23.07.2019 в 22:47
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 24.07.2019 в 06:30
  1. Наличие cookie ещё не означает, что пользователь авторизован.
    require __DIR__ . '/auth.php';

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

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

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

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

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

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

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

Blook 27.07.2019 в 10:13

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 27.07.2019 в 11:11
    <?php if(empty($_COOKIE)):?>
    <p>Вы не авторизованы.</p>
    <?php endif ?>

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

Blook 28.07.2019 в 17:06

поправил

ivashkevich 28.07.2019 в 18:30

Супер!

denis_vsalda@mail.ru 13.08.2019 в 17:03

в 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 13.08.2019 в 19:38

Отлично!

Vladimir96 31.08.2019 в 20:25
//Первое задание: 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 31.08.2019 в 21:08

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

Vladimir96 01.09.2019 в 15:37

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

ivashkevich 02.09.2019 в 04:53

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

Vladimir96 02.09.2019 в 19:59

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

ivashkevich 02.09.2019 в 20:08

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

Vladimir96 02.09.2019 в 20:17

окей понял, кстати случайно обнаружил, что в 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 02.09.2019 в 20:20

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

Vladimir96 02.09.2019 в 20:22

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

ivashkevich 02.09.2019 в 20:25
setcookie('login', $_COOKIE['login'], time() - 1, '/');

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

Vladimir96 02.09.2019 в 20:30

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

ivashkevich 02.09.2019 в 20:31

:)

Dreft 02.09.2019 в 16:52

Задача 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 02.09.2019 в 18:50
  1. Что за -0?
  2. Если куки установлены, это ещё не означает что пользователь авторизован. Нужно так же проверить их на валидность.
Dreft 02.09.2019 в 19:02

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

ivashkevich 02.09.2019 в 19:10

В checkAuth передать

Dreft 02.09.2019 в 19:38

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

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

ivashkevich 02.09.2019 в 20:05

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

Dreft 02.09.2019 в 20:12

Поправил.

ivashkevich 02.09.2019 в 20:13

Супер

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

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

AleksandrNenashev 07.09.2019 в 21:12

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

XXX 08.09.2019 в 17:28

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

ivashkevich 09.09.2019 в 20:39

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

AleksandrNenashev 07.09.2019 в 21:32
<?php
if (!empty($_COOKIE)) {
    require __DIR__ . '/auth.php';

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

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

Ок

AleksandrNenashev 07.09.2019 в 21:34

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

XXX 08.09.2019 в 17:28

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

ivashkevich 09.09.2019 в 20:40

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

AleksandrNenashev 08.09.2019 в 18:34

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

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

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

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

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

AleksandrNenashev 09.09.2019 в 23:44

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

shrineofamana 10.09.2019 в 07:13

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 10.09.2019 в 12:58
if (checkAuth($login, $password)): {
    header('location: /index.php');
}
endif;

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

shrineofamana 10.09.2019 в 13:06

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

ivashkevich 10.09.2019 в 20:45

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

Ooleg 17.09.2019 в 12:12

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 18.09.2019 в 17:41

Отлично

prinzplanloser0514@gmail.com 27.09.2019 в 12:52
 $login = $_POST['login'] ?? '';
    $password = $_POST['password'] ?? '';

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

dliashchenko 29.09.2019 в 23:23

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 30.09.2019 в 00:39

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

H3licoptero 06.10.2019 в 11:10
Первое задание.

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 06.10.2019 в 11:17

Супер

Death4el 07.10.2019 в 12:22

От нечего делать добавил кнопку регистрации,защита от повторного ника,защита от пасса<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 07.10.2019 в 16:21

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

Evilinside 18.10.2019 в 11:18

Здравствуйте. Не совсем понимаю почему в файле usersDB мы просто возвращаем массив? Почему не создать там переменную(массив) и не подключить файл уже в auth? И что означает в данном случае ? после функции getUserLogin(): ?string, да и ?? после

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

Тоже не понятно, вроде нигде про это в курсе не говорилось, а тут бац и появляется. Тоже самое и про if():; else:; endif. Можно, конечно, нагуглить, но для меня это выбивается из всего курса. Мы используем те конструкции, которыми ниразу не пользовались в теме, которые даже не упоминались.
В общем, для меня весь урок в целом - это одно большое пятно.
Было всё по порядку: шли по тропинке небольшими шагами и вдруг решили перепрыгнуть на другую тропинку.

ivashkevich 18.10.2019 в 12:34
ivashkevich 18.10.2019 в 12:35

По вашему первому вопросу не понял в чем разница.

Evilinside 18.10.2019 в 12:38

Имел в виду, что значит "?" после функции перед string.
И для чего мы используем "??" после $passwordFromCookie

ivashkevich 18.10.2019 в 12:41

Я же написал вам ссылки. Прочитать странички по ним вместо вас?

Evilinside 18.10.2019 в 12:43

Пардон, случилось недопонимание.

ivashkevich 18.10.2019 в 14:20

Ок)

prinzplanloser0514@gmail.com 20.10.2019 в 19:09

Я правильно понимаю,что у нас и в базе хэш и в куках,как их тогда сравнивать?

ivashkevich 20.10.2019 в 20:56

В базе хранится хэш пароля. Он проверяется при отправке логина и пароля. То есть проверка происходит с открытым паролем. Если проверка пройдена, создаётся специальный токен. Он сохраняется и в базе, и в браузере пользователя. И при последующих запросах проверка уже происходит путем обычного сравнения этого токена из куки и значением в базе.

prinzplanloser0514@gmail.com 22.10.2019 в 21:56

Cпасибо за ответ,а то было ощущение что что-то упускаю) Вроде картина сложилась,а маленького кусочка не хватало)

anton-gogo@mail.ru 21.10.2019 в 13:38

1 задание

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

if (!empty($_COOKIE)) {
    setcookie("login", $login, -10, '/');
    setcookie("pw", $pw, -10, '/');
    header('location: index.php');
} else {
    header('location: index.php');
}

2е задание

if(!empty($_COOKIE['login']) && !empty($_COOKIE['pw'])){
    header('location: index.php');
}
ivashkevich 21.10.2019 в 17:26

Наличие куки ещё не означает, что пользователь авторизован. Опять используются неопределенные переменные $login и $pw. И снова это приводит к ошибкам, но нет, вам же непонятно с первого раза что нужно включить показ ошибок. Разочаровали вы меня. Пока не разберётесь с показом нотисов дальше проверять не буду. Чем дальше тем хуже. Непонимание происходящего растет как снежный ком.

ivashkevich 22.10.2019 в 22:14

Если всё ещё не получается - напиши мне в личку в ВК или в телеге.

mavrito 26.10.2019 в 07:38

1)

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

2)

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

Буду благодарен за подсказки и попровки!

mavrito 26.10.2019 в 07:42

Посмотрел коммент выше, уже понял свою ошибку во втором задании :) пойду исправлять)

ivashkevich 26.10.2019 в 07:49

Хорошо) не торопитесь

mavrito 26.10.2019 в 07:52
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');
    }
}

Допер что нужно сделать проверку на валидность, исправил, все работает так же:)
Интересно все таки в чем же разница между моим первым решением и вторым. Для чего мы делаем проверку? У нас ведь в cookie после авторизации хранится только один login и один password, после выхода без проверки на валидность мы их удалили и cookie пуст. Можно пояснить разницу далеким?:)

web_x90@mail.ru 01.11.2019 в 15:22

Что такое return [] ? Как бы массив, который будет сам себя возвращать ?

ivashkevich 02.11.2019 в 03:39

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

web_x90@mail.ru 01.11.2019 в 20:52

у меня ошибка: пишет заголовки уже отправлены

ivashkevich 02.11.2019 в 03:41

Значит где-то до передачи заголовков вы уже сделали вывод данных. Функция setcookie должна вызываться до echo.

andreskrip 16.11.2019 в 14:55
//страница logout.php
<?php
require __DIR__ . '/auth.php';

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

if (checkAuth($login, $password)) {
    setcookie('login', '', -10, '/');
    setcookie('password', '', -10, '/');
    header('Location: /index.php');
} else {
    echo 'Вы не были авторизованы' . '<br>';
    echo '<a href="/">Вернуться на главную</a>';
}
ivashkevich 17.11.2019 в 14:14

Отлично

andreskrip 16.11.2019 в 15:21

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

<?php
//проверка авторизации в login.php
require __DIR__ . '/auth.php';
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 {
    $login = $_COOKIE['login'] ?? '';
    $password = $_COOKIE['password'] ?? '';

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

Всё правильно понял. Отлично!

Логические задачи с собеседований