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

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте! У меня есть скрипт авторизации, основанный на 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.01.2017, 17:27
Ответы с готовыми решениями:

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

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

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

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

5
Заблокирован
15.01.2017, 12:23 2
Цитата Сообщение от 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
57 / 57 / 18
Регистрация: 22.05.2015
Сообщений: 607
15.01.2017, 14:43  [ТС] 3
Цитата Сообщение от 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 4
caesarnn, я знаю, что такое соль, но у себя никогда не использовал. Считаю, что этого не требуется. Вы делаете хэш пароля по md5. Обратно получить пароль по хэшу невозможно. Я, например, у себя на сайтах хеширую пароль вместе с какой-нибудь хренью, которую никто не знает. Ну, типа, на всякий случай.
Например:
PHP
1
2
 #устанавливаем куку для безопасности
       setcookie ("hesh", md5($login.'бе-бе') ,time()+ $time_cookies ,'/');
Потом при проверке на каждой странице проверяем эту куку и сравниваем с хэшем в базе. В базу тоже заносим логин вместе с этим бе-бе по md5. Можно ку-ку или ха-ха... без разницы. Уверен, что вообще этого не надо... ну на всякий случай). Если кука не установлена - предлагаем зарегиться или еще что. Можно не куку, а сессию. Вот только кука удалиться, когда Вы это установите. А с сессиями бывает непонятка, если неправильно настроен сервер.

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

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

Добавлено через 17 минут
caesarnn, вот подумай сам. Кому приспичет ломать данные какого-то никчёмного юзера у тебя на сайте? Для админов и модераторов устанавливаются дополнительные проверки.
Я вот, например, подключаюсь к серверу по SSH протоколу. Есть прога для Винды (вероятно и для Линукса есть) putty.exe
Писалась она походу на плюсах или может на чистом Си. Но, это не важно. Дело в том, что любой мало-мало знающий прогер сможет такую же написать. Коннектимся к серверу. Логин обычно root и потом подбирай пароль сколько душе угодно. Вероятность небольшая, но возможность есть. А взлом акка какого-то сраного юзера никому и никогда не будет нужен.
0
15.01.2017, 20:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.01.2017, 20:42
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru