Форум программистов, компьютерный форум, киберфорум
PHP
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
 Аватар для caesarnn
57 / 57 / 18
Регистрация: 22.05.2015
Сообщений: 607

Странно работает авторизация на PHP

13.01.2017, 17:27. Показов 653. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! У меня есть скрипт авторизации, основанный на COOKIE:
HTML5
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
<form id="sign_in" method="POST">
                    <div class="msg">Вход в панель управления</div>
                    <div class="input-group">
                        <span class="input-group-addon">
                            <i class="material-icons">person</i>
                        </span>
                        <div class="form-line">
                            <input type="text" class="form-control" name="login" placeholder="Имя пользователя" required autofocus>
                        </div>
                    </div>
                    <div class="input-group">
                        <span class="input-group-addon">
                            <i class="material-icons">lock</i>
                        </span>
                        <div class="form-line">
                            <input type="password" class="form-control" name="pass" placeholder="Пароль" required>
                        </div>
                    </div>
                    <div class="row">
                        <div class="col-xs-8 p-t-5">
                            
                        </div>
                        <div class="col-xs-4">
                            <button class="btn btn-block bg-pink waves-effect" type="submit">Войти</button>
                        </div>
                    </div>
                    <div class="row m-t-15 m-b--20">
                        
                    </div>
                </form>
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
//запускаем сессию, где будут храниться данные о статусе авторизации пользователя: авторизован, или нет
if (isset($_COOKIE['pass']))
{
     echo "<script>document.location.href='****';</script>";
}
function validfilter($value,$regexp,$flags='usi') {
  if (preg_match('/'.$regexp.'/'.$flags, $value,$result) && $result[0]==$value) return $value;  
  else return false;
}
//получаем логин из формы
$login= validfilter($_POST['login'],'^([A-Za-z0-9-_]){3,20}$');
//получаем уже захэшированный пароль из формы
$pass = $_POST['pass'];
if ($pass) $pass=md5($pass);
//если обе переменные выбраны, то
if (isset ($login,$pass)) {
//подключаемся к базе данных, где хранятся логины пользователей и хэши их паролей
$link = mysqli_connect('localhost', '***', '***', '***') or die ("Не удаётся подключиться к базе данных");
//получаем хэш пароля пользователя из БД
$check = mysqli_query ($link, "SELECT login FROM *** WHERE login = '$login' AND  pass = '$pass'") or die ("Ошибка выполнения запроса");
//создаём ассоциативный массив из этого запроса
$checkarr = mysqli_fetch_array ($check);
//выводим хэш пароля в переменную
$userlogin = $checkarr['login'];
// если хэши пароля из БД и введённого в форме пароля совпадают, то
 
if ($userlogin==$login)  {
$link = mysqli_connect('localhost', '***', '***', '***') or die ("Не удаётся подключиться к базе данных");
    $unstr = md5(uniqid());
    $pass_salted = $unstr.$pass;
  setcookie ('pass', $pass_salted, time()+14400);
    $sethash = mysqli_query($link, "UPDATE *** SET hash = '$pass_salted' WHERE login = '$login'") or die ("Не удалось выполнить запрос");
 echo "<script>document.location.href='http://****';</script>";
}
 
}
?>
На "секретной странице" стоит проверка :
PHP
1
2
3
4
5
6
7
8
9
10
11
12
$conn = mysqli_connect('localhost', '***', '***', '***') or die ("Не удаётся подключиться к базе данных");
session_start();
if (isset($_COOKIE['pass'])) {
$pass = $_COOKIE['pass'];
$query = mysqli_query ($conn, "SELECT login FROM *** WHERE hash = '$pass'");
$check = mysqli_fetch_array($query);
$login = $check['login'];
}
else{
 echo "<script>document.location.href='http://***';</script>";
  exit;
}
Такой вопрос: если я авторизовываюсь на сайте в двух браузерах одновременно, то в одном из них пропадает переменная login (хотя меня никуда не переадресовывает). С чем это может быть связано?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.01.2017, 17:27
Ответы с готовыми решениями:

Не работает авторизация php, javascript. Что не так в коде?
Вот собственно код. При нажатии заполнении логина и пароля и нажатии на ВХОД. Форма пропадает, но авторизация с текстом...

Авторизация не работает, login.php
Решил я написать самодельный файловый хостинг,где у людей будет свой личный кабинет (после регистрации и авторизации,кочечно), и они в нём...

Php странно реагирует на ошибки
Здрасте все! Еще вчера сообщения об ошибках в коде пхп отображались прямо на экране. Сегодня я сделал ошибку...

5
Заблокирован
15.01.2017, 12:23
Цитата Сообщение от caesarnn Посмотреть сообщение
пропадает переменная login
Переменную браузер в любом случае не видит и видеть не должен. Он только может отобразить её значение.
Цитата Сообщение от caesarnn Посмотреть сообщение
есть скрипт авторизации, основанный на COOKIE:
Такое не бывает. Скрипт основан на логике и уникальном коде. Куки Вы устанавливаете в процессе обработки введенных значений.

Цитата Сообщение от caesarnn Посмотреть сообщение

PHP
1
2
3
4
if (isset($_COOKIE['pass']))
{
* * *echo "<script>document.location.href='****';</script>";
}
Что за ерунда? Переадресацию ява-скриптом делают только при крайней необходимости и только тогда, когда уже появляется вывод в браузер. На пыхе это делается так:
PHP
1
2
3
4
if (isset($_COOKIE['pass']))
{
* * header('Refresh: 1; URL=***.php');
}
Можно и так
PHP
1
header('Location: http://***.com');
Цитата Сообщение от caesarnn Посмотреть сообщение
(хотя меня никуда не переадресовывает). С чем это может быть связано?
Это связано с браузером, но никак не с кодом. Или не включены ява-скрипты или уже браузеру достала постоянная переадресация и он отключил эту возможность. Поймите, что так не делается. Вы делаете тормазнутые велосипеды. А в итоге, как обычно, говносайт. Где, блин, Ваша логика? Какая-то секретная страница. Что это вообще такое? Секретная для кого? Гугл один хрен вычислит. Ха-ха)
0
 Аватар для caesarnn
57 / 57 / 18
Регистрация: 22.05.2015
Сообщений: 607
15.01.2017, 14:43  [ТС]
Цитата Сообщение от valet_ Посмотреть сообщение
Какая-то секретная страница. Что это вообще такое? Секретная для кого? Гугл один хрен вычислит.
Не придирайтесь к словам. Страница, для отображения которой требуется авторизация.
Цитата Сообщение от valet_ Посмотреть сообщение
Такое не бывает. Скрипт основан на логике и уникальном коде. Куки Вы устанавливаете в процессе обработки введенных значений.
Да, возможно, не совсем правильно выразился. Скрипт использует файлы COOKIE для авторизации.
Проблему я уже увидел - у меня генерируется соль, которая уникальна для каждой авторизации. Вот она-то и глючит.
Цитата Сообщение от valet_ Посмотреть сообщение
Где, блин, Ваша логика?
Я находил множество примеров скриптов для авторизации в интернете, и на основе них написал свой велосипед. Если можете, то покажите, пожалуйста, какой должна быть, по Вашему мнению, правильная авторизация?

Добавлено через 7 минут
Цитата Сообщение от valet_ Посмотреть сообщение
Это связано с браузером, но никак не с кодом.
PHP
1
2
3
4
5
6
7
8
9
// соль пароля уникальна для каждой авторизации
 $unstr = md5(uniqid());
//и "солёный" пароль тоже
    $pass_salted = $unstr.$pass;
//я записываю в COOKIE хэшированный солёный пароль
setcookie ('pass', $pass_salted, time()+14400);
// и записываю его в БД
    $sethash = mysqli_query($link, "UPDATE *** SET hash = '$pass_salted' WHERE login = '$login'") or die ("Не удалось выполнить запрос");
 echo "<script>document.location.href='http://****';</script>";
Если я кладу в БД уникальный пароль, и авторизовываюсь ещё раз через другой браузер, то соль (и,следовательно, переменная pass_salted) будут другими. На странице, для доступа к которой требуется авторизация, стоит проверка
PHP
1
2
3
4
$pass = $_COOKIE['pass'];
$query = mysqli_query ($conn, "SELECT login FROM *** WHERE hash = '$pass'");
$check = mysqli_fetch_array($query);
$login = $check['login'];
Записанное в COOKIE значение не совпадёт со значением из БД, ведь хэш уже другой, а "старый" браузер об этом не знает!
Т.к. мы повторно авторизовались через другой браузер и "соль" пароля поменялась (в COOKIE браузера, через который мы авторизовались повторно и в базе данных тоже).
В "старом" браузере (где мы авторизовались изначально) в COOKIE записан совсем другой хэш, и поэтому, переменная $login не определена, т.к. MySQL запрос возвращает 0 строк.

Добавлено через 6 минут
Вы могли бы найти проблему, а не сказать, что код говно. Это я и без Вас знаю.
0
Заблокирован
15.01.2017, 18:56
caesarnn, я знаю, что такое соль, но у себя никогда не использовал. Считаю, что этого не требуется. Вы делаете хэш пароля по md5. Обратно получить пароль по хэшу невозможно. Я, например, у себя на сайтах хеширую пароль вместе с какой-нибудь хренью, которую никто не знает. Ну, типа, на всякий случай.
Например:
PHP
1
2
 #устанавливаем куку для безопасности
       setcookie ("hesh", md5($login.'бе-бе') ,time()+ $time_cookies ,'/');
Потом при проверке на каждой странице проверяем эту куку и сравниваем с хэшем в базе. В базу тоже заносим логин вместе с этим бе-бе по md5. Можно ку-ку или ха-ха... без разницы. Уверен, что вообще этого не надо... ну на всякий случай). Если кука не установлена - предлагаем зарегиться или еще что. Можно не куку, а сессию. Вот только кука удалиться, когда Вы это установите. А с сессиями бывает непонятка, если неправильно настроен сервер.

Добавлено через 10 минут
Вероятно, для Вас не логин, а пароль. Это я слил код дополнительной проверки. Но, принцип тот-же.
0
 Аватар для caesarnn
57 / 57 / 18
Регистрация: 22.05.2015
Сообщений: 607
15.01.2017, 20:16  [ТС]
Цитата Сообщение от valet_ Посмотреть сообщение
Обратно получить пароль по хэшу невозможно.
Можно получить по MD5-хэшу исходную строку, но это довольно-таки сложно.

Добавлено через 3 минуты
Цитата Сообщение от valet_ Посмотреть сообщение
Я, например, у себя на сайтах хеширую пароль вместе с какой-нибудь хренью, которую никто не знает.
Эту строку, которую Вы добавляете к логину, тоже можно вычислить.
Всё это делается с помощью т.н. радужных таблиц
0
Заблокирован
15.01.2017, 20:42
Цитата Сообщение от caesarnn Посмотреть сообщение
Эту строку, которую Вы добавляете к логину, тоже можно вычислить.
Всё это делается с помощью т.н. радужных таблиц
Это мало вероятно и возникновение такой возможности будет в процентном отношении вероятности меньше, чем взломают мой пароль на хостинге. Можно всё... даже пальчик в попу. Будем надеяться, что наши сайты - это не сайты демократов у пендосов и они ни кому и нахрен не усрались. А взломать можно любой сайт... было бы желание)

Добавлено через 17 минут
caesarnn, вот подумай сам. Кому приспичет ломать данные какого-то никчёмного юзера у тебя на сайте? Для админов и модераторов устанавливаются дополнительные проверки.
Я вот, например, подключаюсь к серверу по SSH протоколу. Есть прога для Винды (вероятно и для Линукса есть) putty.exe
Писалась она походу на плюсах или может на чистом Си. Но, это не важно. Дело в том, что любой мало-мало знающий прогер сможет такую же написать. Коннектимся к серверу. Логин обычно root и потом подбирай пароль сколько душе угодно. Вероятность небольшая, но возможность есть. А взлом акка какого-то сраного юзера никому и никогда не будет нужен.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.01.2017, 20:42
Помогаю со студенческими работами здесь

SQL в php странно себя ведет
$y = mysql_query(&quot;SELECT * FROM `itemsNal` WHERE `id_item` = &quot;. $item . &quot; and `color` = '$color_one' and `size` = '$size_one'&quot;); вот...

if, else if работает странно.
Написал программу html&gt; &lt;head&gt; &lt;title&gt;Roll Em!&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;div align=&quot;center&quot;&gt; &lt;h1&gt;Roll Em!&lt;/h1&gt; &lt;?php ...

Странно работает цикл while
есть цикл для ajax. раньше он выдавал нормальный результат в зависимости от введенного логина. может я несу бред, но он резко перестал...

Не работает PHP код. Файлы .php не обрабатываются, хотя, если занести в html, всё работает.
не могу разобраться с проблемой. установила денвер, вроде все работает, но как только начала заниматься выяснилось что файлы php не...

$_SERVER['HTTP_REFERER'] странно работает
У меня 2 файла - sender.php и to.php to.php: &lt;? echo $_SERVER; ?&gt; &lt;input type='button' onclick=&quot;location='sender.php'&quot;...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью 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 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru