Этот урок набрал набрал достаточно большое количество
комментариев и дальнейшее его комментирование отключено.
Если вы хотели убедиться в правильности выполнения ДЗ или у вас возник вопрос по уроку,
посмотрите ранее добавленные комментарии, кликнув по кнопке ниже. Скорее всего вы найдете там то, что искали.
Если это не помогло - задайте вопрос в чате в телеграме - https://t.me/php_zone
Вот, теперь логика правильная. Единственное что не учли - в cookie может что-то лежать, но не будет ключей login и password. В таком случае будет warning.
Нужно предусмотреть такой кейс и в переменную login положить пустую строку, если $_COOKIE['login'] не существует:
Знаете, я переборщил с этим заданием. С последними двумя параграфами пока только ознакомьтесь (я их только что подправил). Усовершенствуем систему чуть позже.
PhpStorm - это только редактор. Ошибка возникает во время выполнения скрипта, значит менять нужно версию интерпретатора. Если Вы всё делаете по урокам, то версию нужно менять в настройках OpenServer. Повторите уроки как работает PHP и установка и настройка OpenServer.
<?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');
}
}
setcookie('login', '', -1, '/');
setcookie('password', '', -1, '/');
/**
* У меня папка этого задания называется 23 в локальном сервере phpzone, то есть phpzone/23
* по этому я сначала ставлю / после logout.php а потом поднимаюсь до дирректории повыше ../ и перехожу в index.php
*/
header("Location: " . $_SERVER['REQUEST_URI'] . "/../index.php");
Сначала переписал на require_once потом понял, что там еще подключается usersDB и если там данные изменятся то не получится авторизоваться и исправил этот косяк за собой.
Я забыл написать у меня локальный сервер phpzone а папка с заданием 23 и того phpzone/23/ по этому если я напишу "Location: /index.php" то перекинет на phpzone.
<?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');
Ага сори поправил,а 100 секунд посоветовали на стаке поставить сказали что ставить на час это костыли, вобще в идеале говорили про -1, но я не совсем понял про -1
Добрый день! Спасибо за урок, возник вопрос, ответь пожалуйста с точки зрения максимальной безопасности.
Сгенерировали auth_token, записали его в базу при входе на сайт и в куки к пользователю.
Дальше при повторном посещении сайта пользователем, сравниваем этот токен и если он совпадает с тем что в базе, логинем пользователя.
Допустим этот токен крадут, вставляют себе в куки и посещают сайт. Происходит логин уже поддельного пользователя.
Как должен выглядеть алгоритм правильно и безопасно чтоб даже если украдут куки не смогли войти?
Самый простой вариант - сохранять в базу еще и IP, для которого этот токен создавался. Но есть и более изощренные способы защиты. Стоит устанавливать на сайте SSL-сертификат и cookie передавать только по зашифрованному каналу. Еще стоит запретить куки для JS - всё это можно сделать с помощью setcookie - почитайте документацию по этой функции.
Спасибо за ответ.
Проверять IP будет плохо для пользователя, он может меняться.
Целый день гуглил сегодня)
В итоге вот к чему пришел: При логине через логин пароль, генерируем токен и пишем в куки и в базу, так же пишем user agent в базу.
При повторном заходе смотрим есть ли токен в куках, если есть, ищем такой в базе, если находим, то сравниваем user agent если все совпадает, то логинем пользователя, ставим переменную в сессию и обновляем токен.
++ как Вы сказали SSL и httponly в true.
В целом - лучше. Но вообще - если будут красть куки, то подделать UserAgent - вообще не проблема. Потому что куки всегда крадутся через какой-нибудь сторонний ресурс, получить на этом ресурсе юзерагент - вообще не проблема. Продвинутые защищенные системы могут строиться на совокупности сразу нескольких характеристик - UserAgent, расширение экрана, язык и версия системы, IP, и еще куча всего.
Тут смысл в том что при логине пользователя токен поменяется.
И куками можно воспользоваться пока токен не поменялся.
Плюс на сколько я понял при использовании SSL куки можно украсть только в зашифрованном виде, верно?
Нет. Украсть куки можно не только перехватом трафика между пользователем и сайтом. Есть XSS атаки. Если интересуетесь темой безопасности, можете прочитать вот эту вводную статью =)
Создайте страницу для разлогинивания - logout.php. При переходе на неё должны удаляться cookie с ключами login и password и выполняться редирект на главную страницу. В качестве ответа предоставьте полный код файла logout.php.
Сейчас при переходе авторизованного пользователя на страницу login.php открывается форма авторизации. Сделайте предварительную проверку того, что пользователь уже авторизован. И если он является авторизованным, перенаправляйте его на главную страницу. В качестве ответа на это задание предоставьте только код, который вы добавили в файл login.php.
Неплохое задание, единственная претензия, что используются конструкции, которые хоть и имеют общую тему с уже пройденным материалом, но я думаю требуют некоторого акцента на них:
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 задание
Создайте страницу для разлогинивания - logout.php. При переходе на неё должны удаляться cookie с ключами login и password и выполняться редирект на главную страницу. В качестве ответа предоставьте полный код файла logout.php
Сейчас при переходе авторизованного пользователя на страницу login.php открывается форма авторизации. Сделайте предварительную проверку того, что пользователь уже авторизован. И если он является авторизованным, перенаправляйте его на главную страницу. В качестве ответа на это задание предоставьте только код, который вы добавили в файл login.php.
if (isset($_COOKIE['login'])
&& isset($_COOKIE['password'])) {
header('Location: /index.php');
}
на счет второго задания, где я мыслю не правильно. Как я видел задание. У нас есть страница авторизации, человек вводит свои данные, проходит авторизацию, куки с паролем и логином сохранились. Дальше он закрывает браузер заходит снова на нужный сайт, и я просто поднимаю его куки с паролем и логином, хотя вот тут коненчо можно повторную проверку запилить на совпадение пароля и логина с куки с теми что в базе... наверное вот эту проверку мне и стоило сделать)) Сам ответил на свой вопрос
2) Не справился. Но разобрал код не буду кидать, взял с коментов
Иван, здесь вы подключаете версию 7.0, а для работы используется уже 7.1. (Методом тыка исправил ошибку с ?string)
Привет.
1) На страничке для разлогинивания не должно быть POST-запроса. Это простой GET-запрос. В качестве значений куки login и password стоит указать пустые строки, а не логин (зачем?). Кроме того, if с таким же условием внутри другого if - это бессмысленная проверка. Если выполнится первый, то и второй пройдет.
2) Хорошо, что разобрался. P.S. Меня зовут Артём)
Проверка empty и проверка наличия логина и пароля в cookie не означает, что пользователь авторизован. Это можно узнать, только сравнив эти значения с действительными логином и паролем.
А можете дать код в файле auth.php для версии php 7.0 ? На php 7.2 текущий код работает, а вот на php 7.0 начинает "спотыкаться" об знак вопроса в коде (на 18 строчке в ваших исходниках).
Или хотя бы подскажите, что значит строчка в auth.php:
function getUserLogin(): ?string
У вас в 9 уроке нашел справку только по такому синтаксису:
условие ? результат_если_true : результат_если_false
Но в вашем auth.php нет ни двоеточия между двумя результатами, ни самих двух результатов.
Нашел уже в комментариях, что значит "?". Это понятно. Теперь другой вопрос - можно ли код:
function getUserLogin(): ?string
реализовать по-другому, чтобы он работал и в PHP ранее PHP 7.1?
Да, действительно убрал "?string", оставил только "function getUserLogin()", все заработало. Ребят, всем у кого PHP ниже 7.1, выдает ошибку на "?" в файле auth.php, просто уберите "?string", ну и также уберите двоеточие после function getUserLogin(), будет работать.
И еще все-таки интересно есть ли где-нибудь в интернете справка по такому синтаксису:
function getUserLogin(): ?string
Я не нашел. А что "Вопросительный знак означает, что помимо строки может вернуться null" услышал только от Вас. А вы откуда такой информацией обладаете?
По логике авторизованный пользователь не должен быть на этой странице, а уж если пришел, то форму авторизации можно скрыть условиями (как в index.php) и вывести ссылку с переходом на другую страницу или предложить разлогиниться.
Сделал код как у Вас в уроке. Выбивают ошибку 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 строке все работает.
Мы проверяем валидность логина и пароля из куки. Если все ок - редирект на главную.
Если логин или пароль не совпадают - просто предложение к авторизации остается.
Я сейчас специально авторизовался и затем опять перешел на страницу логина - получил редирект. Тут же меняю логин в куке на заведомо неверный - иду на страницу логина и меня просят авторизоваться.
Так в чем ошибка?
P.S. это же только верхняя часть всего кода файла логин....
То есть мне надо писать если $-Cookie[login] = user то тогда перекидывать на главную ну и пароль так же или сравнивать с переменными $login и $password
На странице с логаутом не нужно проверять ничего. Сейчас у вас если туда незалогиненный пользователь зайдет, он там останется.
Во втором задании как раз надо проверять. Перечитайте задание и переделайте всё.
Первое задания исправил. Спасибо)
Второе задание не понял, что там поправлять?
Я действовал по такой логике:
1) Проверил наличие куки и вложил в переменную.
2) И если две эти переменные true, то перевожу на страницу index.php.
окей понял, кстати случайно обнаружил, что в logout.php все таки нужна проверка, иначе если пользователь нажимает правую кнопку мыши на ссылку рарзлогинивания в index.php, то может из выпадающего меню выбрать "Копировать адрес ссылки", вставить ссылку в браузер, перейти на logout.php и ему выдаст кучу ошибок, так как не было проверки.
Я оформил вот так, если пользователь не залогинен, то его перебросит на login.php
w меня ругается на знак ? в файле \auth.php on line 18 вот сама строка - function getUserLogin(): ?string. Если убираю ? то все работает нормально. Почему так происходит?
От нечего делать добавил кнопку регистрации,защита от повторного ника,защита от пасса<5 символов,переписал БД на текстовик(ибо пока не подходил к работе с бд,сори за ужасный код )
Здравствуйте. Не совсем понимаю почему в файле usersDB мы просто возвращаем массив? Почему не создать там переменную(массив) и не подключить файл уже в auth? И что означает в данном случае ? после функции getUserLogin(): ?string, да и ?? после
Тоже не понятно, вроде нигде про это в курсе не говорилось, а тут бац и появляется. Тоже самое и про if():; else:; endif. Можно, конечно, нагуглить, но для меня это выбивается из всего курса. Мы используем те конструкции, которыми ниразу не пользовались в теме, которые даже не упоминались.
В общем, для меня весь урок в целом - это одно большое пятно.
Было всё по порядку: шли по тропинке небольшими шагами и вдруг решили перепрыгнуть на другую тропинку.
В базе хранится хэш пароля. Он проверяется при отправке логина и пароля. То есть проверка происходит с открытым паролем. Если проверка пройдена, создаётся специальный токен. Он сохраняется и в базе, и в браузере пользователя. И при последующих запросах проверка уже происходит путем обычного сравнения этого токена из куки и значением в базе.
Наличие куки ещё не означает, что пользователь авторизован. Опять используются неопределенные переменные $login и $pw. И снова это приводит к ошибкам, но нет, вам же непонятно с первого раза что нужно включить показ ошибок. Разочаровали вы меня. Пока не разберётесь с показом нотисов дальше проверять не буду. Чем дальше тем хуже. Непонимание происходящего растет как снежный ком.
Допер что нужно сделать проверку на валидность, исправил, все работает так же:)
Интересно все таки в чем же разница между моим первым решением и вторым. Для чего мы делаем проверку? У нас ведь в cookie после авторизации хранится только один login и один password, после выхода без проверки на валидность мы их удалили и cookie пуст. Можно пояснить разницу далеким?:)
Решил продолжить условие из урока, где проверяются данные пришедшие через пост-запрос. Получается либо человек неавторизован и заходит туда с этой целью, и тогда идет проверка массива пост, либо же если пост-запрос пустой, проверяются куки на предмет авторизации и идет редирект на главную. Если где-то накосячил - поправьте в суждении)
Для чего эти переменные? Следом же редирект выполняется. После отправки хедера Location не имеет смысла дальше выполнять код. Следует сразу использовать конструкцию die.
Здравствуйте. У меня возник вопрос касательно '/'- если мы указываем '/какой-то файл' - то мы имеем в виду, что данный файл в данной папке, верно? В таком случае, при отправке формы при поставленном слэше action="/какой-то файл" - пхпшторм пишет "cannot resolve file 'какой-то файл', а без слэша всё норм. В чём дело объясните, пожалуйста ?
До сего момента думал, что знаю. И всё равно не могу понять почему action = "/..."- не работает у меня. Допустим у меня есть 2 файла,лежащие в 1ой директории, index.php и form.php. В form.php есть форма с action = "/index.php" - и через слэш не работает, хотя оба файлы находятся в 1ой директории.Даже если прописать целиком весь путь до файла "/папка_где_лежат_файлы/upload.php" все равно та же ошибка "cannot resolve file". Объясните почему?
Сначала залогинился под admin, index.php меня поприветствовал, потом, ради интереса, не выполняя loginout залогинился под user. index.php меня снова поприветствовал, но уже как user, посмотрел переданные куки, есть только куки для user, куки админа пропали, так и должно быть?
Веб-браузер удалил старые куки?
Возможно я неправильно излагал проблему.
Выдавало ошибку в файле auth.php
function checkAuth(string $login, string $password): bool
когда в функцию приходил null ($login=null,$password=null).
Я предполагаю, что из-за отличая класса (приходит не 'string') выводилась критическая ошибка.
Подскажите правильно ли я понял.
Вот такая ошибка выводилась:
Fatal error: Cannot redeclare checkAuth() (previously declared in C:\Server\OSPanel\domains\myproject1.loc\www\auth.php:3) in C:\Server\OSPanel\domains\myproject1.loc\www\auth.php on line 3
т.е. файл auth.php я вызывается 2 раза в случае если $_COOKIE и $_POST одновременно не пустые. Лучше наверно до if вызвать файл auth.php один раз, а из конструкций if исключить.
Поправте если я не правильно понял.
Верно, ошибка именно об этом. Поэтому при подключении файлов, в которых что-то определяется (например, функция) нужно быть предельно аккуратным. И использовать require_once и include_once.
Списал с примера, если честно, не совсем понятно, что это за подпапка cookie в адресе /cookie/index.php ? Обойтись можно и без нее, вроде как я попробовал, но все равно интересно
Я подумала, что если пользователь уже авторизован и просто загружает страничку, то запрос к серверу идет с помощью метода GET. И на основе этого мы можем сделать вывод, что пользователь уже авторизован, поскольку в противном случае к серверу шел запрос с помощью POST. Это неверно? Как тогда сделать более правильно?
Если вдруг пользователь лично сам перейдет на http://myproject.loc/logout.php при этом у него не было изначально куки файлов от этого сайта. Без проверки на пустоту мы просто так установим ему куки =)
Перенаправление (Признаюсь, что подсмотрел код в комментах. Сначала сделал просто проверку на непустые глобальные $_COOKIE['login'] и $_COOKIE['password'] и сразу перенаправление)
Никак не могу разобраться. Все время выходит сообщение об ошибке.
Warning: require(C:\Users\User\Downloads\OSPanel\domains\myproject.loc\www/usersDB.php): failed to open stream: No such file or directory in C:\Users\User\Downloads\OSPanel\domains\myproject.loc\www\auth.php on line 4
Fatal error: require(): Failed opening required 'C:\Users\User\Downloads\OSPanel\domains\myproject.loc\www/usersDB.php' (include_path='.;C:\php\pear') in C:\Users\User\Downloads\OSPanel\domains\myproject.loc\www\auth.php on line 4
Это вы обобщенно? Просто, если опираться на конкретно нашу ситуацию, то куки создаются только в случае авторизации, а значит и их наличие означает, что пользователь авторизован, верно?
А где проверка на то, что эти ключи вообще в массиве есть?
Не протестил как следует... checkAuth же не принимает значение NULL...
В таком случае:
if(!empty($_COOKIE['login'] and $_COOKIE['password'])) {
if (checkAuth($_COOKIE['login'], $_COOKIE['password']) == true) {
header('Location: /index.php');
}
}
По поводу задачи на CZ
Вроде как написал рабочий алгоритм (судя по тестам в ИДЕ), однако CZ настойчиво выдает уведомление о "неопределенной переменной" и не хочет меня проверять.
Раньше справлялся с такими ошибками, а тут просто не знаю, чего от меня хотят. https://codingzone.io/problems/13/solution/1959
неправда. Ошибка о другом. Переведите ошибку, настройте дебаггер, включите показ нотисов у себя на локальном сервере и найдите проблему. До тех пор алгоритм не является рабочим.
по поводу задачи
Да, я неправильно перевел.
Неопределенное смещение, ибо я обращался к несуществующей переменной.
Изменил код, добавил вместо проверки на null проверку на наличие (isset).
Все заработало, но СZ на третьем шаге проверки ругается и утверждает странные для меня вещи.
То есть по мнению вашего робота в массиве есть сумма подряд идущих чисел равная -2.
Хотя такой суммы нет.
Я так понимаю, что робот просто взял самое большое число.
Но ведь условие задачи найти именно сумму.
Я прав, что робот не прав?) https://codingzone.io/ru/problems/13/solution/2055
Артём, такой вопрос. Почему на меня ругается программа? Я добросовестно скопировала с твоего урока программы, но почему-то при переходе на index.php выдаёт ошибку Parse error: syntax error, unexpected '?' in C:\open_server\OpenServer\domains\myproject.loc\www\auth.php on line 16
В чём может быть проблема?
В файле auth.php убирала ? перед string (function getUserLogin(): ?string) и заменяла null на пустую строку (return null;). в общем программа работает, единственное, что нет главной страницы с просьбой Авторизируйтесь. Надеюсь, понятно объяснила проблему.
Пытался сделать для разлогинивания задержку с помощью sleep, с выводимой надписью: "До свидания, имя пользователя", но программа тормозится до вывода строки, хотя сам оператор находится после. А потом происходит быстрый переход на login.php, так что ничего прочитать не успеваешь.
Здравствуйте, у меня при решении задачи "Максимальная сумма подряд идущих чисел" появляется Notice: Undefined offset: 6 in /app/code-9182964404086915278.php on line 10
Нужно оформить код в комментарии (в редакторе комментариев самая первая кнопка).
Нажмите на карандашик и поправьте ваш комментарий, пожалуйста. А потом ответьте мне на этот комментарий. После этого отвечу на вопросы.
Нужно оформить код в комментарии (в редакторе комментариев самая первая кнопка).
Нажмите на карандашик и поправьте ваш комментарий, пожалуйста. А потом ответьте мне на этот комментарий. После этого отвечу на вопросы.
удаление
проверка
Хорошо, всё норм. Только для удаления cookie можно в качестве значения вообще передать пустую строку:
Откуда у Вас берётся адрес header('Location: /cookie/index.php') у меня там пустота.
где там?
if (!empty($_COOKIE)) {
header('Location: /cookie/index.php');
}
пусто в папке cookie
Ну это конкретно этот ученик видимо положил все свои файлы этого урока в папку cookie. В уроке мы ее не создавали. У вас будут другие пути.
А нет, не норм. Проверка проверяет только наличие cookie. При этом не гарантируется, что пользователь авторизован.
вот так по идее гарантируется
Нет, так гарантируется только то, что в cookie есть какие-то данные, но не гарантируется, что эти данные принадлежат какому-то пользователю.
В общем, нужно попытаться их использовать для логина, и если логин успешен, то тогда уже редиректить. Иначе - считать пользователя неавторизованным.
Вот, теперь логика правильная. Единственное что не учли - в cookie может что-то лежать, но не будет ключей login и password. В таком случае будет warning.
Нужно предусмотреть такой кейс и в переменную login положить пустую строку, если $_COOKIE['login'] не существует:
С паролем аналогично.
понял, с горем пополам осилил дз)), точнее с вашей помощью), спасибо большое!
Не за что. Главное, что вы пробуете. Это 99% успеха :)
Ваш код сработал, дело в том, что у меня непонятно где /cookie/index.php, я поставил свой адрес и всё хорошо, спасибо.
logout.php
Во втором задании уже была проверка
При простом переходе (без отправки POST-запроса) не будет у вас никакой проверки. Задание требует выполнения проверки при любом запросе.
а где пароли хешировать? это если пользователь вошел то сделать чтобы они хешировались?
Знаете, я переборщил с этим заданием. С последними двумя параграфами пока только ознакомьтесь (я их только что подправил). Усовершенствуем систему чуть позже.
Пишет, что ошибка в ?string на знак ? указывает, почему?
Версия PHP 7.1? Если ниже - то не заработает.
CTRL + ALT + S -> Languages & Frameworks -> PHP. Там выбрана 7.1, еще есть ниже версии и выше 7.2. Может 7.2 выбрать?
PhpStorm - это только редактор. Ошибка возникает во время выполнения скрипта, значит менять нужно версию интерпретатора. Если Вы всё делаете по урокам, то версию нужно менять в настройках OpenServer. Повторите уроки как работает PHP и установка и настройка OpenServer.
Спасибо за ответ. Буду разбираться. И спасибо вам за ваши уроки! Отличные и реально быстро понимаешь, что да как)
Спасибо за отзыв) Удачи в прохождении)
вот что пишет
Спасибо за еще один урок!)
У меня php 5.4, так что..)
Отлично
В комментариях уже прочитал, что проверку куки можно опустить и в принципе unset тоже, но:
Сначала просто проверял isset-ом далее редиректил, в комментариях вышел прочел, подправил:
Также не понятные языковые конструкции вроде этих:
Понятно что возвращаемое значение должно быть строкой, но не понятен вопросительный знак.
Также и здесь:
Вот это бессмысленно:
Вопросительный знак означает, что помимо строки может вернуться null.
?? - null coalescing operator. Если перед ним null - то вернет значение из правой части, иначе - значение слева.
вторую заданию же мы уже делали
У меня вот такая проверка куки получилась,только при переходе в login.php всё равно требует вводить пароль, хотя куки есть
Проверьте дебаггером, где ошибка.
В панели разработчика пишет что не даёт куки файлам вставить пароль и логин
Напиши в личку в ВК или Телеге.
Ниже Вам подсказали)
а здесь все ок? скобки правильно расставлены?
Именно здесь ошибка)
logout.php
В начале login.php добавил:
Сначала переписал на require_once потом понял, что там еще подключается usersDB и если там данные изменятся то не получится авторизоваться и исправил этот косяк за собой.
Можно просто Location: /index.php
И для первого и для второго случаев. А так - норм.
Я забыл написать у меня локальный сервер phpzone а папка с заданием 23 и того phpzone/23/ по этому если я напишу "Location: /index.php" то перекинет на phpzone.
Норм!
Отлично!
2
Ага сори поправил,а 100 секунд посоветовали на стаке поставить сказали что ставить на час это костыли, вобще в идеале говорили про -1, но я не совсем понял про -1
Перечитайте домашку и посмотрите что вы делаете - проверяете наличие куки, а потом данные POST-запроса - это не имеет смысла.
Добрый день! Спасибо за урок, возник вопрос, ответь пожалуйста с точки зрения максимальной безопасности.
Сгенерировали auth_token, записали его в базу при входе на сайт и в куки к пользователю.
Дальше при повторном посещении сайта пользователем, сравниваем этот токен и если он совпадает с тем что в базе, логинем пользователя.
Допустим этот токен крадут, вставляют себе в куки и посещают сайт. Происходит логин уже поддельного пользователя.
Как должен выглядеть алгоритм правильно и безопасно чтоб даже если украдут куки не смогли войти?
Самый простой вариант - сохранять в базу еще и IP, для которого этот токен создавался. Но есть и более изощренные способы защиты. Стоит устанавливать на сайте SSL-сертификат и cookie передавать только по зашифрованному каналу. Еще стоит запретить куки для JS - всё это можно сделать с помощью setcookie - почитайте документацию по этой функции.
Спасибо за ответ.
Проверять IP будет плохо для пользователя, он может меняться.
Целый день гуглил сегодня)
В итоге вот к чему пришел: При логине через логин пароль, генерируем токен и пишем в куки и в базу, так же пишем user agent в базу.
При повторном заходе смотрим есть ли токен в куках, если есть, ищем такой в базе, если находим, то сравниваем user agent если все совпадает, то логинем пользователя, ставим переменную в сессию и обновляем токен.
++ как Вы сказали SSL и httponly в true.
Поправьте пожалуйста если что не так)
В целом - лучше. Но вообще - если будут красть куки, то подделать UserAgent - вообще не проблема. Потому что куки всегда крадутся через какой-нибудь сторонний ресурс, получить на этом ресурсе юзерагент - вообще не проблема. Продвинутые защищенные системы могут строиться на совокупности сразу нескольких характеристик - UserAgent, расширение экрана, язык и версия системы, IP, и еще куча всего.
Тут смысл в том что при логине пользователя токен поменяется.
И куками можно воспользоваться пока токен не поменялся.
Плюс на сколько я понял при использовании SSL куки можно украсть только в зашифрованном виде, верно?
Нет. Украсть куки можно не только перехватом трафика между пользователем и сайтом. Есть XSS атаки. Если интересуетесь темой безопасности, можете прочитать вот эту вводную статью =)
1)
2)
Создайте страницу для разлогинивания - logout.php. При переходе на неё должны удаляться cookie с ключами login и password и выполняться редирект на главную страницу. В качестве ответа предоставьте полный код файла logout.php.
Сейчас при переходе авторизованного пользователя на страницу login.php открывается форма авторизации. Сделайте предварительную проверку того, что пользователь уже авторизован. И если он является авторизованным, перенаправляйте его на главную страницу. В качестве ответа на это задание предоставьте только код, который вы добавили в файл login.php.
Для заголовка Location лучше указывать абсолютный путь:
Так точно перенесет на index.php в корне сайта.
Наличие Cookie в браузере ещё не означает, что пользователь авторизован. Если они есть, нужно их еще проверить.
Спасибо, поправил.
Хорошо. После отправки header-а location можно сразу завершить работу скрипта с помощью die().
Неплохое задание, единственная претензия, что используются конструкции, которые хоть и имеют общую тему с уже пройденным материалом, но я думаю требуют некоторого акцента на них:
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 задание
2 задание
Отличное дополнение!
Ввожу верные логин/пароль - выдается следующая ошибка:
Parse error: syntax error, unexpected '?' in C:\OSPanel\domains\myproject.loc\www\auth.php on line 14
Памагите(
Переводить ошибку пробовали?
Да, уже решил, где то выше описание было)
Правильно.
Создайте страницу для разлогинивания - logout.php. При переходе на неё должны удаляться cookie с ключами login и password и выполняться редирект на главную страницу. В качестве ответа предоставьте полный код файла logout.php
Сейчас при переходе авторизованного пользователя на страницу login.php открывается форма авторизации. Сделайте предварительную проверку того, что пользователь уже авторизован. И если он является авторизованным, перенаправляйте его на главную страницу. В качестве ответа на это задание предоставьте только код, который вы добавили в файл login.php.
на счет второго задания, где я мыслю не правильно. Как я видел задание. У нас есть страница авторизации, человек вводит свои данные, проходит авторизацию, куки с паролем и логином сохранились. Дальше он закрывает браузер заходит снова на нужный сайт, и я просто поднимаю его куки с паролем и логином, хотя вот тут коненчо можно повторную проверку запилить на совпадение пароля и логина с куки с теми что в базе... наверное вот эту проверку мне и стоило сделать)) Сам ответил на свой вопрос
Всё именно так)
1)
2) Не справился. Но разобрал код не буду кидать, взял с коментов
Иван, здесь вы подключаете версию 7.0, а для работы используется уже 7.1. (Методом тыка исправил ошибку с ?string)
Привет.
1) На страничке для разлогинивания не должно быть POST-запроса. Это простой GET-запрос. В качестве значений куки login и password стоит указать пустые строки, а не логин (зачем?). Кроме того, if с таким же условием внутри другого if - это бессмысленная проверка. Если выполнится первый, то и второй пройдет.
2) Хорошо, что разобрался. P.S. Меня зовут Артём)
Добрый день! Спасибо за очередной урок:
1 задание:
В index:
Привет. isset($_COOKIE) - не показывает того, авторизован ли пользователь.
А так?
1
В logout.php
2
Вверху login.php
Проверка empty и проверка наличия логина и пароля в cookie не означает, что пользователь авторизован. Это можно узнать, только сравнив эти значения с действительными логином и паролем.
Задание 1
Задание 2
ОК!
Наконец то понял какую именно нужно проводить проверку. Вроде этот код отрабатывает как нужно , спасибо за разъяснение !!!
Чет не работает.
Никогда не изменяйте значения элементов служебных массивов!
Logout
Checking if already logged in
ОК!
А можете дать код в файле auth.php для версии php 7.0 ? На php 7.2 текущий код работает, а вот на php 7.0 начинает "спотыкаться" об знак вопроса в коде (на 18 строчке в ваших исходниках).
Или хотя бы подскажите, что значит строчка в auth.php:
function getUserLogin(): ?string
У вас в 9 уроке нашел справку только по такому синтаксису:
условие ? результат_если_true : результат_если_false
Но в вашем auth.php нет ни двоеточия между двумя результатами, ни самих двух результатов.
Это значит что тип возвращаемого значения либо string, либо null
Нашел уже в комментариях, что значит "?". Это понятно. Теперь другой вопрос - можно ли код:
function getUserLogin(): ?string
реализовать по-другому, чтобы он работал и в PHP ранее PHP 7.1?
Можно убрать тип возвращаемого значения. Но вообще, используйте последнюю версию PHP.
Да, действительно убрал "?string", оставил только "function getUserLogin()", все заработало. Ребят, всем у кого PHP ниже 7.1, выдает ошибку на "?" в файле auth.php, просто уберите "?string", ну и также уберите двоеточие после function getUserLogin(), будет работать.
Отлично
logout.php
login.php
login: наличие куки с логином и паролем еще не означает, что пользователь авторизован (то есть что они валидные).
А как проверить валидность?
У нас есть функция checkAuth
И еще все-таки интересно есть ли где-нибудь в интернете справка по такому синтаксису:
function getUserLogin(): ?string
Я не нашел. А что "Вопросительный знак означает, что помимо строки может вернуться null" услышал только от Вас. А вы откуда такой информацией обладаете?
http://php.net/manual/ru/migration71.new-features.php
Спасибо большое. Сам почему-то не нашел.
Первое задание:
Во втором задании сделал так:
По логике авторизованный пользователь не должен быть на этой странице, а уж если пришел, то форму авторизации можно скрыть условиями (как в index.php) и вывести ссылку с переходом на другую страницу или предложить разлогиниться.
Красава.
$loginFromCookie = $_COOKIE['login'] ?? ''; Что означают два вопросительных знака подряд?
https://www.php.net/manual/ru/migration70.new-features.php
Сделал код как у Вас в уроке. Выбивают ошибку Parse error: syntax error, unexpected '?' in W:\domains\myproject.loc\www\auth.php on line 17.
После удаление знака вопроса в 17 строке кода выбивает следующую ошибку.
После удаления типа стринг возращаемого значения функции в 17 строке все работает.
А зачем вы удалили знак вопроса, не разобравшись для чего он? =)
https://www.php.net/manual/ru/migration71.new-features.php
logout.php
login.php
Наличие логина в куки еще не означает, что пользователь авторизован. Он с помощью специальных расширений в браузере какие захочет может наставить.
Еще пароль в проверку писать?
Наличие какого-то пароля в куках ещё не говорит о том, что логин и пароль верные, и пользователь действительно авторизован.
Правильно
Ну и ладно, что убил на это целый день, зато решил :))
Нужно проверить сначала, есть ли в $_COOKIE такой ключ, прежде чем использовать.
Не совсем понял - в чем ошибка?
Если в массиве не будет одного из ключей, то при обращении по нему будет ошибка
Все равно не понимаю вашу мысль.
Я сейчас специально авторизовался и затем опять перешел на страницу логина - получил редирект. Тут же меняю логин в куке на заведомо неверный - иду на страницу логина и меня просят авторизоваться.
Так в чем ошибка?
P.S. это же только верхняя часть всего кода файла логин....
Ещё раз говорю - при обращении к значению массива по несуществующему ключу будет ошибка.
Приведите пожалуйста пример, ну не догоняю я :(
Задание 1:
Задание 2:
Отлично!
Наличие куки ещё не говорит о том, что пользователь авторизован.
То есть мне надо писать если $-Cookie[login] = user то тогда перекидывать на главную ну и пароль так же или сравнивать с переменными $login и $password
У вас для этого есть готовая функция уже. Только перед ее вызовом нужно проверить, что в куках действительно есть эти значения.
долго думал но наконец до меня дошло как это сделать
Опять не проверяете массив на наличие ключей! Нельзя быть уверенным что здесь
что-то есть. Рискуете нарваться на ошибку каждый раз. Устал уже писать об одном и том же.
Всмысле? Я же проверяю если куки не пустой то пишу проверку логина и пароля
Нет проверки на то, что в массиве $_COOKIE вообще есть ключ login или password.
Разлогинивание:
Проверка авторизации:
Про разлогинивание - наличие данных в куки, еще не означает, что пользователь авторизован. Мало ли, чего он там себе напихал в записи.
Значит просто их удалить?
Нет. Это значит, что нужно убедиться, что он действительно авторизован.
//1
(isset($_COOKIE)) - всегда вернёт true
//2
Всё ок, кроме той же ошибки, что и выше
У меня вопрос по данному коду:
Я не пойму, как в данном случае скрываются те или иные строки html, вот ты прописал:
и выводится именно это:
Мы же получается пишем обычный html код уже за пределами <?php ?> и как он улавливает данные условия?
Просто я для себя представлял правильным примерно так:
и понимал как работает, а по твоему коду не совсем понял, но походу просто надо это запомнить и выучить что так тоже можно и всё?
Да. Так просто можно и это надо запомнить.
1
Файл logout.php
2
Удаление
Проверка
Файл для чего подключаете? Там ведь только функция.
Откуда взяться переменным $login и $password? Будет ошибка.
Бред полный.
Если куки нет, то...
Пытаемся взять значение из куки.
Бред! Переделывайте. Хоть бы проверили, что работает, перед тем как отправлять это сюда.
Logout (Исправил код, убрав проверку на наличие кук в теге body)
login
Пользователь может быть неавторизованным, даже если куки у него есть. Например, если данные в куках неправильные
поправил
Супер!
в logout.php
А в index.php если пользователь авторизован добавил ссылку на Logout.php
Проверка:
Отлично!
На странице с логаутом не нужно проверять ничего. Сейчас у вас если туда незалогиненный пользователь зайдет, он там останется.
Во втором задании как раз надо проверять. Перечитайте задание и переделайте всё.
Первое задания исправил. Спасибо)
Второе задание не понял, что там поправлять?
Я действовал по такой логике:
1) Проверил наличие куки и вложил в переменную.
2) И если две эти переменные true, то перевожу на страницу index.php.
Во втором задании наличие куки ещё не означает что пользователь авторизован. Я могу прямо в хроме у себя любые куки насоздавать.
Поправил, посмотрите пожалуйста)
$userIsAuthor as $value - плохие имена переменных. Абсолютно не отражают того, что в них на самом деле хранится.
окей понял, кстати случайно обнаружил, что в logout.php все таки нужна проверка, иначе если пользователь нажимает правую кнопку мыши на ссылку рарзлогинивания в index.php, то может из выпадающего меню выбрать "Копировать адрес ссылки", вставить ссылку в браузер, перейти на logout.php и ему выдаст кучу ошибок, так как не было проверки.
Я оформил вот так, если пользователь не залогинен, то его перебросит на login.php
Так, стоп. Нафига туда текущее значение куки передавать? Для разлогинивания надо их убрать. Передав null, например.
туда это куда?
Для логаута. Передавать в куки в качестве значения текущее значение куки - ерунда какая-то. Передавай туда null.
нихера себе подробность)) теперь все сошлось, спасибо) я и понятия не имел, что можно null передать)
:)
Задача 1.
Задача 2.
Не понимаю, с чем их сравнивать.
В checkAuth передать
Все, доехал, поправил.
Я почему-то пытался вклинить проверку не туда.
Ок. Только вместо нуля нужно передавать какое-то нормальное значение. Иначе после закрытия браузера авторизация будет слетать.
Поправил.
Супер
Ок, только (getUserLogin()) не нужно оборачивать в скобки. И Yoda condition я не одобряю.
w меня ругается на знак ? в файле \auth.php on line 18 вот сама строка - function getUserLogin(): ?string. Если убираю ? то все работает нормально. Почему так происходит?
Скорее всего ты используешь старую версию php
Нужна более новая версия php
Ок
Почему многие указывают в строках setcookie('login', $login, -10, '/'); число -10?
Число не имеет значение. Если будет со знаком минус куки удалятся.
Посмотри официальную документацию.
Значит мой ответ неправильный?
Если пользователь авторизован, то отправить его на страницу авторизации. Бред, конечно.
Второй код был с изменениями просто не увидел. До него отправил правильный.
1 задание:
2 задание:
Во втором задании столкнулся с несколькими ошибками, было интересно их решить и почитать заодно документацию.
Это синтаксис для шаблонов. В коде его не используют.
Спасибо, исправлено.
В комментарии ничего не изменилось
logout.php
добавил в login.php
Отлично
Что за два вопроса после логина и пароля ?
Оператор объединения с null
logout.php
login.php
Исправил на:
вынес в начало login.php
из условия
Если куки установлены, это ещё не означает что пользователь авторизован. Нужно так же проверить их на валидность.
Супер
От нечего делать добавил кнопку регистрации,защита от повторного ника,защита от пасса<5 символов,переписал БД на текстовик(ибо пока не подходил к работе с бд,сори за ужасный код )
Пойдет, молодец
Здравствуйте. Не совсем понимаю почему в файле usersDB мы просто возвращаем массив? Почему не создать там переменную(массив) и не подключить файл уже в auth? И что означает в данном случае ? после функции getUserLogin(): ?string, да и ?? после
Тоже не понятно, вроде нигде про это в курсе не говорилось, а тут бац и появляется. Тоже самое и про if():; else:; endif. Можно, конечно, нагуглить, но для меня это выбивается из всего курса. Мы используем те конструкции, которыми ниразу не пользовались в теме, которые даже не упоминались.
В общем, для меня весь урок в целом - это одно большое пятно.
Было всё по порядку: шли по тропинке небольшими шагами и вдруг решили перепрыгнуть на другую тропинку.
На этом этапе пора учиться гуглить)
https://www.php.net/manual/ru/migration70.new-features.php
https://www.php.net/manual/ru/migration71.new-features.php
По вашему первому вопросу не понял в чем разница.
Имел в виду, что значит "?" после функции перед string.
И для чего мы используем "??" после $passwordFromCookie
Я же написал вам ссылки. Прочитать странички по ним вместо вас?
Пардон, случилось недопонимание.
Ок)
Я правильно понимаю,что у нас и в базе хэш и в куках,как их тогда сравнивать?
В базе хранится хэш пароля. Он проверяется при отправке логина и пароля. То есть проверка происходит с открытым паролем. Если проверка пройдена, создаётся специальный токен. Он сохраняется и в базе, и в браузере пользователя. И при последующих запросах проверка уже происходит путем обычного сравнения этого токена из куки и значением в базе.
Cпасибо за ответ,а то было ощущение что что-то упускаю) Вроде картина сложилась,а маленького кусочка не хватало)
1 задание
2е задание
Наличие куки ещё не означает, что пользователь авторизован. Опять используются неопределенные переменные $login и $pw. И снова это приводит к ошибкам, но нет, вам же непонятно с первого раза что нужно включить показ ошибок. Разочаровали вы меня. Пока не разберётесь с показом нотисов дальше проверять не буду. Чем дальше тем хуже. Непонимание происходящего растет как снежный ком.
Если всё ещё не получается - напиши мне в личку в ВК или в телеге.
1)
2)
Буду благодарен за подсказки и попровки!
Посмотрел коммент выше, уже понял свою ошибку во втором задании :) пойду исправлять)
Хорошо) не торопитесь
Допер что нужно сделать проверку на валидность, исправил, все работает так же:)
Интересно все таки в чем же разница между моим первым решением и вторым. Для чего мы делаем проверку? У нас ведь в cookie после авторизации хранится только один login и один password, после выхода без проверки на валидность мы их удалили и cookie пуст. Можно пояснить разницу далеким?:)
Что такое return [] ? Как бы массив, который будет сам себя возвращать ?
Идите по курсу, не забегайте вперёд. Массивы ничего не могут возвращать.х
у меня ошибка: пишет заголовки уже отправлены
Значит где-то до передачи заголовков вы уже сделали вывод данных. Функция setcookie должна вызываться до echo.
Отлично
Решил продолжить условие из урока, где проверяются данные пришедшие через пост-запрос. Получается либо человек неавторизован и заходит туда с этой целью, и тогда идет проверка массива пост, либо же если пост-запрос пустой, проверяются куки на предмет авторизации и идет редирект на главную. Если где-то накосячил - поправьте в суждении)
Всё правильно понял. Отлично!
logout.php
Отлично
редирект авторизованного пользователя с login.php (фрагмент)
Отлично
Отлично
logout.php
login.php
Супер!
//logout.php
//Проверка авторизации
Тернарный оператор используется для возврата значения, а не для проверки условий. Переделайте на if
Переделал
Супер!
Сделайте предварительную проверку того, что пользователь уже авторизован
Тогда здесь будет ошибка. Всегда нужно проверять входные данные!
проще так:
Для чего эти переменные? Следом же редирект выполняется. После отправки хедера Location не имеет смысла дальше выполнять код. Следует сразу использовать конструкцию die.
Здравствуйте. У меня возник вопрос касательно '/'- если мы указываем '/какой-то файл' - то мы имеем в виду, что данный файл в данной папке, верно? В таком случае, при отправке формы при поставленном слэше action="/какой-то файл" - пхпшторм пишет "cannot resolve file 'какой-то файл', а без слэша всё норм. В чём дело объясните, пожалуйста ?
Привет. Ты в курсе как работают абсолютные и относительные ссылки.
До сего момента думал, что знаю. И всё равно не могу понять почему action = "/..."- не работает у меня. Допустим у меня есть 2 файла,лежащие в 1ой директории, index.php и form.php. В form.php есть форма с action = "/index.php" - и через слэш не работает, хотя оба файлы находятся в 1ой директории.Даже если прописать целиком весь путь до файла "/папка_где_лежат_файлы/upload.php" все равно та же ошибка "cannot resolve file". Объясните почему?
Они у вас в корневой папке сайта? Вы веб-сервер используете?
Да, os использую, оба файла находятся в /OS/domains/myproject.loc/www/request/
напишите в личку
Хорошо
Location с большой буквы пишется. Лучше указывать абсолютный путь до страницы редиректа. Или относительный, но начинающийся с /
Отлично
Проверил, вроде бы работает стабильно :/
Наличие куки с логином и паролем еще не означает, что пользователь авторизован. Я могу их прямо в браузере создать и написать там что угодно.
Вот так?
это условие всегда выполнится, в нем нет смысла
Почему getUserLogin а не checkAuth?
logout.php
login.php
Это что за ерунда? Такого в решении, присылаемом на проверку, быть не должно.
Если куки установлены, это ещё не означает что пользователь авторизован. Нужно так же проверить их на валидность.
Сначала залогинился под admin, index.php меня поприветствовал, потом, ради интереса, не выполняя loginout залогинился под user. index.php меня снова поприветствовал, но уже как user, посмотрел переданные куки, есть только куки для user, куки админа пропали, так и должно быть?
Веб-браузер удалил старые куки?
Заменил
Отлично, только ?> в конце файла не нужен.
Спасибо за ответ! Это я знаю, только там не конец файла, это конец блока php, далее идет блок html
А, точно. Тогда норм)
logout.php
login.php у меня 2 варианта:
1.
2.
второй мне нравится больше, в первом не происходит проверка логина и пароля. Подскажите какой вариант лучше использовать.
Второй правильный. Причину вы сами написали)
Спасибо!
Я нашел ошибку, если оставить код:
то при не пустом Cookie, при условии что логина и пароля там нет возникает ошибка
В результате я исправил код на :
проверте пожалуйста.
Прям ошибка, или просто код лишний раз выполнится? Это две разные вещи. Тогда уж сразу проверять наличие ключей, не проверять пустоту массива в целом.
Возможно я неправильно излагал проблему.
Выдавало ошибку в файле auth.php
когда в функцию приходил null ($login=null,$password=null).
Я предполагаю, что из-за отличая класса (приходит не 'string') выводилась критическая ошибка.
Подскажите правильно ли я понял.
Вот такая ошибка выводилась:
Ошибка вообще про другое. Вы бы хоть перевести её попробовали.
А кажется я разобрался, проблема в том что функция обЪявляется несколько раз
вот полный код:
т.е. файл auth.php я вызывается 2 раза в случае если $_COOKIE и $_POST одновременно не пустые. Лучше наверно до if вызвать файл auth.php один раз, а из конструкций if исключить.
Поправте если я не правильно понял.
Верно, ошибка именно об этом. Поэтому при подключении файлов, в которых что-то определяется (например, функция) нужно быть предельно аккуратным. И использовать require_once и include_once.
Огромное спасибо!!!
logout.php
login.php (ADDED)
Списал с примера, если честно, не совсем понятно, что это за подпапка cookie в адресе /cookie/index.php ? Обойтись можно и без нее, вроде как я попробовал, но все равно интересно
С какого момента перестали понимать? На этом этапе довольно странно списывать, всё слишком просто.
1) logout.php
2) login.php
Строки пишутся в одинарных кавычках.
В остальном всё отлично!
Код для проверки, является ли пользователь уже авторизованным.
Код для разлогинивания.
Это для чего?
Я подумала, что если пользователь уже авторизован и просто загружает страничку, то запрос к серверу идет с помощью метода GET. И на основе этого мы можем сделать вывод, что пользователь уже авторизован, поскольку в противном случае к серверу шел запрос с помощью POST. Это неверно? Как тогда сделать более правильно?
Вполне норм, просто хотел от вас это услышать)
1.
2.
Закрывающий тег ?> в конце файла не нужен.
Для чего проверка массива куки на пустоту?
Если вдруг пользователь лично сам перейдет на http://myproject.loc/logout.php при этом у него не было изначально куки файлов от этого сайта. Без проверки на пустоту мы просто так установим ему куки =)
Это страшно?
Разлогиниваемся:
А вот с проверкой непонятное что-то. Чтобы я не делал - не перенаправляет на главную автоматически. Только после нажатия кнопки Submit
Строки пишутся в одинарных кавычках!
На этом можно работу скрипта завершать. Дальнейшее выполнение не имеет смысла.
Это точно мне?
Я не понял, почему не работал прошлый код. Но вот так - заработало:
Да, мое сообщение написано прямо под куском кода, где строка в двойных кавычках.
Повторюсь. После отправки заголовка с локейшеном дальше можно не выполнять код и ставить return. У вас же дальше проверяется post запрос...
Отступы поехали, будьте внимательнее
Спасибо!
1.
2.
Можно сразу проверять
и только после этого подключать auth.php
logout.php
Перенаправление (Признаюсь, что подсмотрел код в комментах. Сначала сделал просто проверку на непустые глобальные $_COOKIE['login'] и $_COOKIE['password'] и сразу перенаправление)
Для удаления куки в качестве значения нужно указывать пустую строку
Исправил
Отлично
1
исправил
2 сам только 50% (догадался только проверить наличие куки)
Для удаления куки в качестве значения нужно передавать пустую строку
Никак не могу разобраться. Все время выходит сообщение об ошибке.
Warning: require(C:\Users\User\Downloads\OSPanel\domains\myproject.loc\www/usersDB.php): failed to open stream: No such file or directory in C:\Users\User\Downloads\OSPanel\domains\myproject.loc\www\auth.php on line 4
Fatal error: require(): Failed opening required 'C:\Users\User\Downloads\OSPanel\domains\myproject.loc\www/usersDB.php' (include_path='.;C:\php\pear') in C:\Users\User\Downloads\OSPanel\domains\myproject.loc\www\auth.php on line 4
Пишет, что файла нет
Задание №1
Задание №2
Наличие куки еще не означает, что пользователь авторизован.
Пройдите дополнительный урок Обработка форм в PHP и исправьте ошибки
Наличие куки еще не означает, что пользователь авторизован.
Логин - ОК.
Остаётся логаут поправить.
Без проверки куки на пустоту.
А для чего проверка на наличие куки?
Отлично
Наличие куки еще не означает что пользователь авторизован
тогда можно добавить проверку функцией
Норм!
Это вы обобщенно? Просто, если опираться на конкретно нашу ситуацию, то куки создаются только в случае авторизации, а значит и их наличие означает, что пользователь авторизован, верно?
Нет. Я могу прямо в браузере себе каких угодно куки насоздавать и они не будут иметь никакого отношения к логике сайта.
Предыдущую домашку сдавал - в комментах.
Новая домашка - https://codingzone.io/problems/13/solution/1334
Можно обойтись одним массивом - https://codingzone.io/ru/problems/13/solution/867
как так?(
я пишу невероятно сложные решения, в то время когда есть решения проще и короче
Это просто опыт) В программировании, как и в других творческих вещах, нужно отсекать лишнее
logout
login
Отсюда вопрос, имеет ли значение, с точки зрения оптимизации кода - подключать файлы только при соблюдении определенных условий, например:
Или просто в шапке сразу размещать? Или не имеет значения?
А где проверка на то, что эти ключи вообще в массиве есть?
С точки зрения оптимизации - имеет. Но нужна эта оптимизация или нет - это уже другой вопрос.
Не протестил как следует... checkAuth же не принимает значение NULL...
В таком случае:
По поводу задачи на CZ
Вроде как написал рабочий алгоритм (судя по тестам в ИДЕ), однако CZ настойчиво выдает уведомление о "неопределенной переменной" и не хочет меня проверять.
Раньше справлялся с такими ошибками, а тут просто не знаю, чего от меня хотят.
https://codingzone.io/problems/13/solution/1959
Это так не работает. Если хотя бы один из ключей не будет присутствовать, будет ошибка. Оператор and не используется.
Пройдите дополнительный урок Обработка форм в PHP и исправьте ошибки
неправда. Ошибка о другом. Переведите ошибку, настройте дебаггер, включите показ нотисов у себя на локальном сервере и найдите проблему. До тех пор алгоритм не является рабочим.
по первому замечанию
по поводу задачи
Да, я неправильно перевел.
Неопределенное смещение, ибо я обращался к несуществующей переменной.
Изменил код, добавил вместо проверки на null проверку на наличие (isset).
Все заработало, но СZ на третьем шаге проверки ругается и утверждает странные для меня вещи.
То есть по мнению вашего робота в массиве есть сумма подряд идущих чисел равная -2.
Хотя такой суммы нет.
Я так понимаю, что робот просто взял самое большое число.
Но ведь условие задачи найти именно сумму.
Я прав, что робот не прав?)
https://codingzone.io/ru/problems/13/solution/2055
Ну, если все-же я неправильно понял условие задачи и само число исходного массива тоже нужно учитывать, то:
https://codingzone.io/ru/problems/13/solution/2058
Продолжу обучение.
зачем сравнивать true с true?)
Последовательность из одного числа.
Спасибо за проверку.
logout.php
login.php
Задача - https://codingzone.io/problems/13/solution/1961
Что в if, что в else одна и та же строка:
можно вынести за пределы условия
Исправил
Отлично
Проверка
Отлично
Удаление
Отлично
Привет, так правильно будет?
logout.php
Артём, такой вопрос. Почему на меня ругается программа? Я добросовестно скопировала с твоего урока программы, но почему-то при переходе на index.php выдаёт ошибку Parse error: syntax error, unexpected '?' in C:\open_server\OpenServer\domains\myproject.loc\www\auth.php on line 16
В чём может быть проблема?
В файле auth.php убирала ? перед string (function getUserLogin(): ?string) и заменяла null на пустую строку (return null;). в общем программа работает, единственное, что нет главной страницы с просьбой Авторизируйтесь. Надеюсь, понятно объяснила проблему.
Нашла в комментариях, как решить проблему.
Нужно выбрать версию PHP не ниже 7.1
Да. Только строки пишутся в одинарных кавычках
login.php
2.
А почему так не пойдёт?
2(b)
empty работает не так. Если этих ключей не будет, возникнет ошибка. Пройдите дополнительный урок Обработка форм в PHP и исправьте.
после $_COOKIE пробел не нужен
Для чего во втором решении все эти манипуляции? По факту если есть любые куки происходит редирект.
ок
??
Рекомендую ознакомиться с другими решениями в комментариях. Как-то всё переусложнено.
Пройдите дополнительный урок Обработка форм в PHP и исправьте ошибки (обращаетесь к ключам массива, которых может не быть).
Для строк используются одинарные кавычки!
Проблема с форматированием. Делайте отступы и переносы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L
Добрый день!
logout.php
login.php
Норм!
Здравствуйте!
Пытался сделать для разлогинивания задержку с помощью sleep, с выводимой надписью: "До свидания, имя пользователя", но программа тормозится до вывода строки, хотя сам оператор находится после. А потом происходит быстрый переход на login.php, так что ничего прочитать не успеваешь.
logout.php
login.php
Конечно, sleep тормозит формирование страницы на стороне сервера. Вам нужно сделать это с помощью JS. Пример
Понял. Попробую. Спасибо!
В куках хранить логин??? Пароль???
Привет. Это обучающий пример, показывающий как работать с куки, дальше будет объяснено почему так делать не стоит и будут примеры с auth token
logout.php
login.php
Отлично!
logout.php
login.php
Ок. А где $error используется?
В дальнейшем коде с html в body. просто здесь не написал, так как его оставил как в уроке...
Ок
Отлично!
Здравствуйте, у меня при решении задачи "Максимальная сумма подряд идущих чисел" появляется Notice: Undefined offset: 6 in /app/code-9182964404086915278.php on line 10
$nums = explode(' ', $line);
$max = max($nums);
$value = 0;
for($x = 0; $x <= count($nums); $x++){
$value = $value + $nums[$x];
}
if($max == 0){
$max = max($nums);
}
echo $max;
Нужно оформить код в комментарии (в редакторе комментариев самая первая кнопка).
Нажмите на карандашик и поправьте ваш комментарий, пожалуйста. А потом ответьте мне на этот комментарий. После этого отвечу на вопросы.
Logout:
2ое задание на проверку авторизации пользователя на странице login
В начале добавил следующие строчки
Наличие куки еще не означает что пользователь авторизован!
Соблюдайте отступы.
logout.php
login.php
Отлично
logout.php
login.php
Отлично
В заключении в первом абзаце добавь запятую перед "НО":
"Пока что - вот такая простейшая, но небезопасная система авторизации."
:)
Спасибо, поправил
И для чего там слэши?
Наличие куки не означает что пользователь авторизован
Для чего вот это?
Значит не надо упоминания файла?
Вы мне скажите, для чего подключили этот файл здесь?)
Логика была такая, что если при подключении куков мы обращались к этому файлу, то и при их удалении надо обратиться к файлу)
Интересно, можно ответить, если комментарии закрыты
1 logout.php
2 login.php тут я долго тупил, почему функция checkAuth() не определена), в итоге вынес
Из циклов вообще и вроде все корректно работает)
Отлично
Артем вот сделал
<?php
setcookie('login', $login,time() - 3600);
setcookie('password', $password,time() - 3600);
header('Location: /index.php');
?>
<html>
<head>
<title>Форма деавторизации</title>
</head>
<body>
<form action="/logout.php" method="post">
</form>
</body>
</html>
Правильно ?
Нужно оформить код в комментарии (в редакторе комментариев самая первая кнопка).
Нажмите на карандашик и поправьте ваш комментарий, пожалуйста. А потом ответьте мне на этот комментарий. После этого отвечу на вопросы.
logout.php
В самое начало кода добавил функцию которую мы писали ранее на проверку куки
Отлично
logout.php
login.php
Отлично