Форум программистов, компьютерный форум, киберфорум
Наши страницы

PHP

Войти
Регистрация
Восстановить пароль
 
Uni_programist
1 / 1 / 0
Регистрация: 11.08.2016
Сообщений: 147
Завершенные тесты: 1
#1

Авторизация. Исправить ошибки в авторизации - PHP

28.01.2018, 18:43. Просмотров 202. Ответов 14
Метки нет (Все метки)

Здравствуйте!
Работаю с авторизацией и использую самые инновационные методы моего хостинга, а также PHP 7.1 и PDO. Проблема в том, что сейчас работает авторизация сама по себе. Т.е какой логин ввел пользователь, такой логин отображается в личном профиле.
Вот код на текущий момент, хотя проделывал множество разных манипуляций по несколько раз, но не работает:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
    session_start();
    header("Content-Type: text/html; charset=utf-8");
    include "DataBaze.php";
    $logintrade= filter_input_array(INPUT_POST,[
         'login'=>FILTER_SANITIZE_STRING,
         'password'=>[
            'filter'=>FILTER_VALIDATE_REGEXP,
            'options'=>['regexp'=>'/.{5,}/']
         ],
     ]);
     if($logintrade){
         $empty_fields= array_filter (($logintrade= array_map('trim',$logintrade)), function($a) {
             return empty($a);
         });
     if (count($empty_fields)){
         echo '<script type="text/javascript">alert("Поля обязательны для заполнения!");document.location.href = "/reg/";</script>'; 
         print_r($empty_fields);
     }
     else{
         $sth= $DataBaze->prepare("SELECT COUNT(*)FROM `users`  WHERE `login`=? AND `password`=?");
         $sth->execute([
                 $logintrade['login'],
                 $logintrade['password'],
             ]);
     if ($sth->fetchColumn(0)){ 
     }
     else {
         if (password_verify($logintrade['password'], $hash)){
             $_SESSION['name'] = $logintrade['login'];
             header("Location: /outh/userspage.php");
             exit();         
         }
         else{
             echo '<script type="text/javascript">alert("Верификация не пройдена! Авторизация отклонена!");document.location.href = "/outh/";</script>'; 
         }
     }
     }
     }
?>
Однако, он все время выдает сообщение:
Кликните здесь для просмотра всего текста

Верификация не пройдена! Авторизация отклонена!

Вот еще один вариант, но он направляет на личную страницу пользователя с любым логином и паролем. (Логин в сессиях)
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
    session_start();
    header("Content-Type: text/html; charset=utf-8");
    include "DataBaze.php";
    $logintrade= filter_input_array(INPUT_POST,[
         'login'=>FILTER_SANITIZE_STRING,
         'password'=>[
            'filter'=>FILTER_VALIDATE_REGEXP,
            'options'=>['regexp'=>'/.{5,}/']
         ],
     ]);
     if($logintrade){
         $empty_fields= array_filter (($logintrade= array_map('trim',$logintrade)), function($a) {
             return empty($a);
         });
     if (count($empty_fields)){
         echo '<script type="text/javascript">alert("Поля обязательны для заполнения!");document.location.href = "/reg/";</script>'; 
         print_r($empty_fields);
     }
     else{
         $sth= $DataBaze->prepare("SELECT COUNT(*)FROM `users`  WHERE `login`=? AND `password`=?");
         $sth->execute([
                 $logintrade['login'],
                 password_hash($logintrade['password']),
             ]);
     if ($sth->fetchColumn(0)){ 
     }
     else {
         if ($logintrade['password']){
             $_SESSION['name'] = $logintrade['login'];
             header("Location: /outh/userspage.php");
             exit();         
         }
         else{
             echo '<script type="text/javascript">alert("Верификация не пройдена! Авторизация отклонена!");</script>'; 
         }
     }
     }
     }
?>
Все подробней смогут рассказать скриншоты Базы Данных, станицы авторизации и личный кабинет пользователя. Прилагаю все это ниже.
Проверим последний вариант кода, вводим в поле
ЛОГИН: login
ПАРОЛЬ: 12345
А в первом варианте просто выбрасывает второй раз на станицу авторизации, например используем логин admin и его пароль (правильный) и все равно выбрасывает. Прошу, помогите мне с этим, т.к переписываю уже раз сотый и все равно не работает должным образом.
0
Миниатюры
Авторизация. Исправить ошибки в авторизации   Авторизация. Исправить ошибки в авторизации   Авторизация. Исправить ошибки в авторизации  

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.01.2018, 18:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Авторизация. Исправить ошибки в авторизации (PHP):

Обработка ошибки авторизации - PHP
Доброго времени суток. Для сайта пишу всплывающее окно с возможностью вход\регистрации. В поисковиках, а так же на форуме поискал, но...

Как исправить ошибки в админке PHP - PHP
1.Админка походу самописная при создании новой страницы выдает ошибку Row insertedWarning: Cannot modify header information - headers...

После авторизации повторно перекидывает обратно на страницу авторизации - PHP
Так, у меня есть проблема. Как только авторизируюсь, перекидывает обратно на авторизацию. Вот код, login.php: &lt;? ...

Исправить ошыбки при авторизации - PHP
Всем добрый день, у меня всегда видает ошыбку когда хочу авторизоваться &quot;Warning: mysqli_fetch_assoc() expects parameter 1 to be...

Ошибки авторизации на сайте - PHP
Добрый день. Пишу форму входа на сайт и конечно же форму регистрации. Использую MySql. Регистрация работает на ура. Авторизация чуток не...

Ошибки при авторизации - PHP
Добрый день - делаю авторизацию пользователей. Имею вот такой код &lt;?php include &quot;connect_bd_login.php&quot;; $userinfo=''; $state='0'; ...

14
atanov
46 / 46 / 12
Регистрация: 26.05.2016
Сообщений: 334
29.01.2018, 12:05 #2
А Вы проверяли $logintrade['password']? Если всё время у Вас else, очевидно, что, что-то не так с методом этого объекта.
Для начала я бы проверил:
PHP
1
2
3
 'password'=>[
 'filter'=>FILTER_VALIDATE_REGEXP,
            'options'=>['regexp'=>'/.{5,}/']
Что пишется в объект, и сравнить, с тем, как должно быть. Регулярка, понимаете ли, вещь такая..., где очень часто ошибки происходят.
0
Uni_programist
1 / 1 / 0
Регистрация: 11.08.2016
Сообщений: 147
Завершенные тесты: 1
30.01.2018, 20:04  [ТС] #3
atanov, выдает пароль в открытом виде. Однако из этого делаем вывод, что регулярка не причем, настоящее время код выглядит так, а вот как его исправить:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php
     session_start();
     header("Content-Type: text/html; charset=utf-8");
     include ('DataBaze.php');
         $logintrade= filter_input_array(INPUT_POST,[
             'login'=>FILTER_SANITIZE_STRING,
             'password'=>[ 
                 'filter'=> FILTER_VALIDATE_REGEXP,
                 'options'=>['regexp'=>'/.{5,}/']
                 ]
            ]);
         if (!$logintrade){
              return; 
         }
         $logintrade= array_map('trim',$logintrade);
         $empty_fields= array_filter($logintrade, function($b) {
             return $b === '';
         });
         if(count($empty_fields)>0){
             header ("Location: /reg/");
             exit();
         }
         $stmt= $DataBaze->prepare('SELECT * FROM `users` WHERE `login`=?  LIMIT 1');
         $stmt->execute([
             $logintrade['login'],
             ]);
         if ($user === false || !password_verify($logintrade['password'],$user['password'])){
         print $logintrade['password'];
         
             exit();
                   
            }
         $_SESSION['name'] = $logintrade['login'];
         header("Location: /outh/userspage.php");
             exit();
Пароль в точности тот, который был указан при регистрации, т.к хранится в файле .txt и я могу его скопировать. Пароль идет гладко без пробелов.
0
Миниатюры
Авторизация. Исправить ошибки в авторизации  
atanov
46 / 46 / 12
Регистрация: 26.05.2016
Сообщений: 334
30.01.2018, 21:54 #4
Ну а Вы поверили $logintrade['password']? Я бы с этого начал, т.к. очевидно условие в 29-й строке всегда false. Ну последний Ваш скрипт, что именно не так делает?
0
Uni_programist
1 / 1 / 0
Регистрация: 11.08.2016
Сообщений: 147
Завершенные тесты: 1
31.01.2018, 12:54  [ТС] #5
atanov, в том то и дело я не знаю как использовать password_verify, хотя и сотрел документацию 5 раз? для проверки пароль и запрос SQL должен быть наверное таким
SQL
1
SELECT * FROM `users` WHERE `login`=? AND `password`=?  LIMIT 1
Переменная $user дает логин к базе данных в фале подключения к БД.
Если брать последний скрипт, мною написанный, то он просто передает введенный логин в сессию и переходит на личную станицу пользователя, но... . Как известно, в базе данных только один пользователь- admin. Пароль его 36018Google49ONet50 .
Очистим сессии файла userspage.php:
PHP
1
session_destroy();
Введем постороннего пользователя. Например, пусть у него будут такие данные:
Логин: dostup
Пароль:Ok2LahtASm2018eH43
Проверим:
Пользователь системы dostup
Вы на секретной странице dostup
Но такого пользователя в Базе Данных вообще нет.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
    session_start();
    header("Content-Type: text/html; charset=utf-8");
    include "DataBaze.php";
    $logintrade= filter_input_array(INPUT_POST,[
         'login'=>FILTER_SANITIZE_STRING,
         'password'=>[
            'filter'=>FILTER_VALIDATE_REGEXP,
            'options'=>['regexp'=>'/.{5,}/']
         ],
     ]);
     print $logintarde['password'];
     if($logintrade){
         $empty_fields= array_filter (($logintrade= array_map('trim',$logintrade)), function($a) {
             return empty($a);
         });
     if (count($empty_fields)){
         echo '<script type="text/javascript">alert("Поля обязательны для заполнения!");document.location.href = "/reg/";</script>'; 
         print_r($empty_fields);
     }
     else{
         $sth= $DataBaze->prepare("SELECT COUNT(*)FROM `users`  WHERE `login`=? AND `password`=?");
         $sth->execute([
                 $logintrade['login'],
                 password_hash($logintrade['password']),
             ]);
     if ($sth->fetchColumn(0)){ 
     }
     else {
         if ($logintrade['password']){
             $_SESSION['name'] = $logintrade['login'];
             header("Location: /outh/userspage.php");
             exit();         
         }
         else{
             echo '<script type="text/javascript">alert("Верификация не пройдена! Авторизация отклонена!");</script>'; 
         }
     }
     }
     }
?>
0
Миниатюры
Авторизация. Исправить ошибки в авторизации   Авторизация. Исправить ошибки в авторизации  
atanov
46 / 46 / 12
Регистрация: 26.05.2016
Сообщений: 334
31.01.2018, 14:15 #6
Uni_programist,
Правильно ли я понял, что Вам нужно, что когда пользователь ввёл правильные login и password, то должна загрузиться некая страница - секретная. И она загружается, только если пользователь авторизован. Верно?
0
Jewbacabra
Эксперт PHP
2820 / 2407 / 904
Регистрация: 24.04.2014
Сообщений: 7,270
31.01.2018, 15:51 #7
Цитата Сообщение от Uni_programist Посмотреть сообщение
я не знаю как использовать password_verify, хотя и сотрел документацию 5 раз
Что такое кеш и что в бд хранится в таблице users в столбце password?

SQL
1
SELECT * FROM users WHERE 1 = 0
Сколько строк будет в результате запроса?
А если так?
SQL
1
SELECT COUNT(*) FROM users WHERE 1 = 0
0
Uni_programist
1 / 1 / 0
Регистрация: 11.08.2016
Сообщений: 147
Завершенные тесты: 1
31.01.2018, 17:02  [ТС] #8
atanov, да,это "Личный кабинет пользователя" и попасть в него можно только введя правильный логин и пароль.
Jewbacabra, итак, при регистрации была использована функция password_hash(), которая создала мощный кеш пароля по алгоримтму CRYPT_BLOWFISH.
Попробуем выполнить запрос SQL
SQL
1
SELECT * FROM users WHERE 1 = 0
Ответ: MySQL вернула пустой результат (т.е. ноль строк). (Запрос занял 0.0006 сек.)
Попробуем выполнить запрос SQL
SQL
1
SELECT COUNT(*) FROM users WHERE 1 = 0
Получим, то что получили на скриншоте
Ответ: SQL-запрос успешно выполнен.
Правда я не понял к чему эти вопросы? Проверить, каким образом База данных возвращает данные?
0
Миниатюры
Авторизация. Исправить ошибки в авторизации  
Jewbacabra
Эксперт PHP
2820 / 2407 / 904
Регистрация: 24.04.2014
Сообщений: 7,270
31.01.2018, 17:32 #9
Цитата Сообщение от Uni_programist Посмотреть сообщение
при регистрации была использована функция password_hash(), которая создала мощный кеш пароля по алгоримтму CRYPT_BLOWFISH.
А из чего состоит этот кеш (ответ тут)? И следовательно будет ли он один и тот же для одного пароля?

Цитата Сообщение от Uni_programist Посмотреть сообщение
Получим, то что получили на скриншоте
Т.е. одну строку. Тут меня форматирование кода несколько сбило.
PHP
1
2
3
4
5
6
7
8
9
10
// зачем такая конструкция
if ($a) {
} else {
    // code
}
 
// можно же без пустой ветки
if (!$a) {
    // code
}
Сейчас получается логика что если строка найдена (т.е пользователь нашелся) ничего не делать, иначе кинуть на страницу пользователя.
0
Uni_programist
1 / 1 / 0
Регистрация: 11.08.2016
Сообщений: 147
Завершенные тесты: 1
31.01.2018, 22:02  [ТС] #10
Jewbacabra, код сейчас выглядит код:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
    session_start();
    header("Content-Type: text/html; charset=utf-8");
    include "DataBaze.php";
    $logintrade= filter_input_array(INPUT_POST,[
         'login'=>FILTER_SANITIZE_STRING,
         'password'=>[
            'filter'=>FILTER_VALIDATE_REGEXP,
            'options'=>['regexp'=>'/.{5,}/']
         ],
     ]);
     print $logintarde['password'];
     if($logintrade){
         $empty_fields= array_filter (($logintrade= array_map('trim',$logintrade)), function($a) {
             return empty($a);
         });
     if (count($empty_fields)){
         echo '<script type="text/javascript">alert("Поля обязательны для заполнения!");document.location.href = "/reg/";</script>'; 
         print_r($empty_fields);
     }
     else{
         $sth= $DataBaze->prepare("SELECT COUNT(*)FROM `users`  WHERE `login`=? AND `password`=?");
         $sth->execute([
                 $logintrade['login'],
                 $logintrade['password'],
             ]);
       if (!password_verify($logintrade['password'], $hash)) {
              $_SESSION['name'] = $logintrade['login'];
             header("Location: /outh/userspage.php");
             exit();         
}
else {
    echo 'Отмена';
    exit();
}
 
     }
     }
Однако входит на страницы пользователей, которых не существует? например:
Логин: dospup
Пароль: 56765
Что не так не пойму? Моежет стоит добавить SQL запрос здесь :
PHP
1
2
3
4
5
if (!password_verify($logintrade['password'], $hash)) {
             //SQL-запрос
              $_SESSION['name'] = $logintrade['login'];
             header("Location: /outh/userspage.php");
             exit();
0
Миниатюры
Авторизация. Исправить ошибки в авторизации  
Jewbacabra
Эксперт PHP
2820 / 2407 / 904
Регистрация: 24.04.2014
Сообщений: 7,270
31.01.2018, 22:20 #11
Цитата Сообщение от Uni_programist Посмотреть сообщение
PHP
1
password_verify($logintrade['password'], $hash)
Переменная $hash не определена

Цитата Сообщение от Uni_programist Посмотреть сообщение
$sth= $DataBaze->prepare("SELECT COUNT(*)FROM `users` WHERE `login`=? AND `password`=?");
$sth->execute([
$logintrade['login'],
$logintrade['password'],
]);
Эти 2 поля одно и то же, или все же нет? И зачем оно в запросе нужно?
0
Uni_programist
1 / 1 / 0
Регистрация: 11.08.2016
Сообщений: 147
Завершенные тесты: 1
31.01.2018, 23:20  [ТС] #12
Jewbacabra, пробовал прописывать переменную $hash в файле подключения так:
PHP
1
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';
но не знаю работает это или нет
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Эти 2 поля одно и то же, или все же нет? И зачем оно в запросе нужно?
Скажу сейчас наугад, но слегка подумаю.
Поскольку мы передаем SQL запрос, с безымянным палероидом, то данный запрос будет выбирать все данные с БД, а
PHP
1
2
3
4
$sth->execute([
$logintrade['login'],
$logintrade['password'],
]);
по моей "идеи" должен сверить значения. Отсюда, вывод что эти строки различны, но служат для "общего дела".
0
Jewbacabra
Эксперт PHP
2820 / 2407 / 904
Регистрация: 24.04.2014
Сообщений: 7,270
01.02.2018, 00:30 #13
Цитата Сообщение от Uni_programist Посмотреть сообщение
Скажу сейчас наугад, но слегка подумаю.
Поскольку мы передаем SQL запрос, с безымянным палероидом, то данный запрос будет выбирать все данные с БД, а
Задам чуть по-другому: для чего эта часть условия AND `password`=?
0
Uni_programist
1 / 1 / 0
Регистрация: 11.08.2016
Сообщений: 147
Завершенные тесты: 1
01.02.2018, 16:25  [ТС] #14
Jewbacabra, Как я уже говорил запрос выбирает все данные, а метод execute сравнивает полученные данные и возвращает true or false. Хотя, может быть я и неправ, т.к только начал изучать язык программирования PHP.
0
Uni_programist
1 / 1 / 0
Регистрация: 11.08.2016
Сообщений: 147
Завершенные тесты: 1
02.02.2018, 16:50  [ТС] #15
Jewbacabra, теперь код выглядит так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
     session_start();
     header ("Content-Type: text/html; charset=utf-8");
     include ("DataBaze.php");
         $logintrade=filter_input_array(INPUT_POST,[
             'login'=>FILTER_SANITIZE_STRING,
             'password'=>[
                 'filter'=>FILTER_VALIDATE_REGEXP,
                 'options'=>['regexp'=>'/.{5,}/']
                 ],
             ]);
             if ($logintrade) {
                 $empty_fields= array_filter (($logintrade= array_map('trim',$logintrade)), function($b) {
                     return empty ($b);
                 });
             if (count($empty_fields)){
                 print_r($empty_fields);
             }
             else {
                 $stm= $DataBaze->prepare("SELECT COUNT(*)FROM `users` WHERE `login`=?");
                 $stm->execute([
                     $logintrade['login'],
                     ]);
             if ($raw = $stm->fetch(PDO::FETCH_ASSOC)){
                 if (password_verify($logintrade['password'], $raw['password'])){
                 $_SESSION['name'] = $raw['name'];
                 header ("Location: userspage.php");
                 exit();
   }
}
             else {
                 header ("Location: userspage.php");
             }
             }
             }
?>
Но теперь просто выдает белый экран в логах информации 0, как можно исправить? Ведь по идеи, если все введено верно, то переадресуем на страницу user-a иначе кидаем на страницу user-a, и уж там разбирается система выгнать его или нет (если пароль не верный).
0
02.02.2018, 16:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.02.2018, 16:50
Привет! Вот еще темы с ответами:

Поиск ошибки в форме авторизации - PHP
Начну с кода. func.php #Генирация случайной строки function RandomString($length = 8) { $string = ''; //Наборы символов ...

Школьный журнал - настроить отправку SMS и исправить ошибку при авторизации по пин-коду - PHP
Для общеобразовательной школы нашел скрипт школьного журнала. Все у него работает, кроме отправки SMS и пустая страница при авторизации...

как исправить ошибки?? - PHP
Здравствуйте, помогите решить проблему... хочу запустить сайт с Denwer но никак не получается, видает ошыбки: Warning:...

.NET 3.x Исправить ошибки в коде авторизации на сайте - C#
Как убрать эти ошибки using System; using System.Linq; using System.Collections.Generic; using System.ComponentModel; using...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru