Форум программистов, компьютерный форум, киберфорум
PHP
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
4 / 3 / 2
Регистрация: 11.08.2016
Сообщений: 352

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

28.01.2018, 18:43. Показов 797. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.01.2018, 18:43
Ответы с готовыми решениями:

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

Веб авторизация, достать куки из авторизации через webBrowser
Вход на сайте провожу через контрол webBrowser, потому что на сайте https/SSL/TLS потому так проще в несколько строчек кода, но подальшую...

Организация авторизации в домене, клиент-сервер-домен-авторизация
Здравствуйте. Передо мной стоит следующая задача: нужно написать клиент-сервер, с возможностью авторизации клиента &quot;tr&quot; на...

14
 Аватар для atanov
640 / 481 / 172
Регистрация: 26.05.2016
Сообщений: 2,674
29.01.2018, 12:05
А Вы проверяли $logintrade['password']? Если всё время у Вас else, очевидно, что, что-то не так с методом этого объекта.
Для начала я бы проверил:
PHP
1
2
3
 'password'=>[
 'filter'=>FILTER_VALIDATE_REGEXP,
            'options'=>['regexp'=>'/.{5,}/']
Что пишется в объект, и сравнить, с тем, как должно быть. Регулярка, понимаете ли, вещь такая..., где очень часто ошибки происходят.
0
4 / 3 / 2
Регистрация: 11.08.2016
Сообщений: 352
30.01.2018, 20:04  [ТС]
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
640 / 481 / 172
Регистрация: 26.05.2016
Сообщений: 2,674
30.01.2018, 21:54
Ну а Вы поверили $logintrade['password']? Я бы с этого начал, т.к. очевидно условие в 29-й строке всегда false. Ну последний Ваш скрипт, что именно не так делает?
0
4 / 3 / 2
Регистрация: 11.08.2016
Сообщений: 352
31.01.2018, 12:54  [ТС]
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
640 / 481 / 172
Регистрация: 26.05.2016
Сообщений: 2,674
31.01.2018, 14:15
Uni_programist,
Правильно ли я понял, что Вам нужно, что когда пользователь ввёл правильные login и password, то должна загрузиться некая страница - секретная. И она загружается, только если пользователь авторизован. Верно?
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
31.01.2018, 15:51
Цитата Сообщение от 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
4 / 3 / 2
Регистрация: 11.08.2016
Сообщений: 352
31.01.2018, 17:02  [ТС]
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
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
31.01.2018, 17:32
Цитата Сообщение от 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
4 / 3 / 2
Регистрация: 11.08.2016
Сообщений: 352
31.01.2018, 22:02  [ТС]
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
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
31.01.2018, 22:20
Цитата Сообщение от 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
4 / 3 / 2
Регистрация: 11.08.2016
Сообщений: 352
31.01.2018, 23:20  [ТС]
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
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
01.02.2018, 00:30
Цитата Сообщение от Uni_programist Посмотреть сообщение
Скажу сейчас наугад, но слегка подумаю.
Поскольку мы передаем SQL запрос, с безымянным палероидом, то данный запрос будет выбирать все данные с БД, а
Задам чуть по-другому: для чего эта часть условия AND `password`=?
0
4 / 3 / 2
Регистрация: 11.08.2016
Сообщений: 352
01.02.2018, 16:25  [ТС]
Jewbacabra, Как я уже говорил запрос выбирает все данные, а метод execute сравнивает полученные данные и возвращает true or false. Хотя, может быть я и неправ, т.к только начал изучать язык программирования PHP.
0
4 / 3 / 2
Регистрация: 11.08.2016
Сообщений: 352
02.02.2018, 16:50  [ТС]
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.02.2018, 16:50
Помогаю со студенческими работами здесь

Найти ошибки в коде и исправить эти ошибки (Наследование)
Вот в общем 3 файла, изучаю наследование на примере односвязного и двусвязного списков: list.h (inline) #pragma once class list...

Исправить процедуру авторизации пользователя
Private Sub UserForm_Initialize() For j = 3 To 1 Step -1 login = InputBox(&quot;Введите Логин, осталось &quot; + CStr(j) + &quot; попыток&quot;) ...

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

Исправить ошибку в авторизации в программе
Помогите найти ошибку! Option Explicit Public LoginSucceeded As Boolean Private Sub cmdCancel_Click() 'set the global var...

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
[В процессе разработки] SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru