Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
157 / 2 / 1
Регистрация: 18.07.2011
Сообщений: 10

Регистрация с зашифрованным паролем в COOKIE и фиксацией ip

12.06.2013, 11:36. Показов 2467. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня не вопрос. Просто хочу поделиться тем, что у меня получилось. Может кому-то окажется полезным. Регистрацию я взял отсюда: http://ruseller.com/lessons.php?rub=37&id=369
Но мне не понравилось, что пароль в куках хранится в незашифрованном виде и я немножко переделал скрипт. Теперь пароль в куках хранится в зашифрованном виде и ip посетителя сохраняется в базе данных, так что если злоумышленник похитит куки и подставит их на своем компьютере, то он всё равно не сможет войти на сайт, так как у него ip отличается от сохраненного в базе данных.
Я изменил два файла index.php и testreg.php и в таблице users добавил поле ip - VARCHAR(20)

index.php
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
<?php
// вся процедура работает на сессиях. Именно в ней хранятся данные пользователя, пока он находится на сайте. Очень важно запустить их в самом начале странички!!!
session_start();
 
include ("bd.php");// файл bd.php должен быть в той же папке, что и все остальные, если это не так, то просто измените путь 
 
if (isset($_COOKIE['auto']) and isset($_COOKIE['login']) and isset($_COOKIE['password']))
{//если есть необходимые переменные
    $login = $_COOKIE['login'];
    $password = $_COOKIE['password'];
    $result = mysql_query("SELECT ip FROM users WHERE login='$login' AND password='$password' AND activation='1'",$db); 
    $myrow = mysql_fetch_array($result);
    //извлекаем нужные данные о пользователе
    $ip=$_SERVER['REMOTE_ADDR']; 
    if( $ip == $myrow['ip'] ){ // если ip совпадает
        if ($_COOKIE['auto'] == 'yes') { // если пользователь желает входить автоматически, то запускаем сессии
              $_SESSION['password']=$_COOKIE['password']; //в куках пароль был не зашифрованный, а в сессиях обычно храним зашифрованный
              $_SESSION['login']=$_COOKIE['login'];//сессия с логином
              $_SESSION['id']=$_COOKIE['id'];//идентификатор пользователя
        }
    }
    else{   $_SESSION['password']=''; // если ip не совпадает выводим форму входа
         echo "Вы зашли с другого ip-".$ip." Введите логин и пароль";
    }
}
 
if (!empty($_SESSION['login']) and !empty($_SESSION['password']))
{
    //если существет логин и пароль в сессиях, то проверяем их и извлекаем аватар
    $login = $_SESSION['login'];
    $password = $_SESSION['password'];
    $result = mysql_query("SELECT id,avatar FROM users WHERE login='$login' AND password='$password' AND activation='1'",$db); 
    $myrow = mysql_fetch_array($result);
    //извлекаем нужные данные о пользователе
}
?>
<html>
<head>
<title>Главная страница</title>
<link href="st.css" rel="stylesheet" type="text/css">
</head>
<body>
<h2>Главная страница</h2>
 
 
<?php
if (!isset($myrow['avatar']) or $myrow['avatar']=='') {
//проверяем, не извлечены ли данные пользователя из базы. Если нет, то он не вошел, либо пароль в сессии неверный. Выводим окно для входа. Но мы не будем его выводить для вошедших, им оно уже не нужно.
  print <<<HERE
<form action="testreg.php" method="post">
<!-- testreg.php - это адрес обработчика. То есть, после нажатия на кнопку "Войти", данные из полей отправятся на страничку testreg.php методом "post"  -->
  <p>
    <label>Ваш логин:<br></label>
    <input name="login" type="text" size="15" maxlength="15"
HERE;
 
    
if (isset($_COOKIE['login'])) //есть ли переменная с логином в COOKIE. Должна быть, если пользователь при предыдущем входе нажал на чекбокс "Запомнить меня"
{
//если да, то вставляем в форму ее значение. При этом пользователю отображается, что его логин уже вписан в нужную графу
echo ' value="'.$_COOKIE['login'].'">';
}
 
 
print <<<HERE
  </p>
<!-- В текстовое поле (name="login" type="text") пользователь вводит свой логин -->  
  <p>
    <label>Ваш пароль:<br></label>
    <input name="password" type="password" size="15" maxlength="15" >
HERE;
 
    
print <<<HERE
  </p>
<!-- В поле для паролей (name="password" type="password") пользователь вводит свой пароль -->  
  <!--p>
    <input name="save" type="checkbox" value='1'> Запомнить меня.
  </p-->
  <!--p>
    <input name="autovhod" type="checkbox" value='1'> Автоматический вход.
  </p-->
 
<p>
<input type="submit" name="submit" value="Войти">
<!-- Кнопочка (type="submit") отправляет данные на страничку testreg.php  --> 
<br>
<!-- ссылка на регистрацию, ведь как-то же должны гости туда попадать  --> 
<a href="reg.php">Зарегистрироваться</a> 
 
<br>
<!-- ссылка на восстановление пароля  --> 
<a href="send_pass.php">Забыли пароль?</a> 
 
</p></form>
<br>
Вы вошли на сайт, как гость<br><!--a href='#'>Эта ссылка доступна только зарегистрированным пользователям</a-->
HERE;
}
 
else
{
//при удачном входе пользователю выдается все, что расположено ниже между звездочками.
//************************************************************************************
 
print <<<HERE
|<a href='page.php?id=$_SESSION[id]'>Моя страница</a>|<a href='index.php'>Главная страница</a>|<a href='all_users.php'>Список пользователей</a>|<a href='exit.php'>Выход</a><br><br>
 
<!-- Между оператором  "print <<<HERE" выводится html код с нужными переменными из php -->
Вы вошли на сайт, как $_SESSION[login]<br>
<!-- выше ссылка на выход из аккаунта -->
 
<!--a href='http://tvpavlovsk.sk6.ru/'>Эта ссылка доступна только зарегистрированным пользователям</a><br-->
Ваш аватар:<br>
<img alt='$_SESSION[login]' src='$myrow[avatar]'>
<!-- Выше отображается аватар. Его адрес содержит переменная $myrow[avatar] -->
 
<!-- Именно здесь можно добавлять формы для отправки комментариев и прочего... -->
 
HERE;
 
 
//************************************************************************************
//при удачном входе пользователю выдается все, что расположено ВЫШЕ между звездочками.
}
 
?>
</body>
</html>
testreg.php
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
<?php
session_start();// вся процедура работает на сессиях. Именно в ней хранятся данные пользователя, пока он находится на сайте. Очень важно запустить их в самом начале странички!!!
          
if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} } //заносим введенный пользователем логин в переменную $login, если он пустой, то уничтожаем переменную
if (isset($_POST['password'])) { $password=$_POST['password']; if ($password =='') { unset($password);} }
//заносим введенный пользователем пароль в переменную $password, если он пустой, то уничтожаем переменную
 
if (empty($login) or empty($password)) //если пользователь не ввел логин или пароль, то выдаем ошибку и останавливаем скрипт
{
    exit ("Вы ввели не всю информацию, вернитесь назад и заполните все поля!"); //останавливаем выполнение сценариев
}
//если логин и пароль введены,то обрабатываем их, чтобы теги и скрипты не работали, мало ли что люди могут ввести
$login = stripslashes($login);
$login = htmlspecialchars($login);
 
$password = stripslashes($password);
$password = htmlspecialchars($password);
 
//удаляем лишние пробелы
$login = trim($login);
$password = trim($password);
 
 
// дописываем новое********************************************
 
// подключаемся к базе
include ("bd.php");// файл bd.php должен быть в той же папке, что и все остальные, если это не так, то просто измените путь 
 
// минипроверка на подбор паролей
$ip=getenv("HTTP_X_FORWARDED_FOR");
if (empty($ip) || $ip=='unknown') { $ip=getenv("REMOTE_ADDR"); }
 
mysql_query ("DELETE FROM oshibka WHERE UNIX_TIMESTAMP() - UNIX_TIMESTAMP(date) > 900");//удаляем ip-адреса ошибавшихся при входе пользователей через 15 минут.
 
$result = mysql_query("SELECT col FROM oshibka WHERE ip='$ip'",$db);// извлекаем из базы колличество неудачных попыток входа за последние 15 минут у пользователя с данным ip
$myrow = mysql_fetch_array($result);
 
if ($myrow['col'] > 2) {
    exit ("Вы набрали логин или пароль неверно 3 раза. Подождите 15 минут до следующей попытки."); //останавливаем выполнение сценариев
 
 
}
 
$password = md5($password);//шифруем пароль
$password = strrev($password);// для надежности добавим реверс
$password = $password."b3p6f"; 
//можно добавить несколько своих символов по вкусу, например, вписав "b3p6f". Если этот пароль будут взламывать методом подбора у себя на сервере этой же md5,то явно ничего хорошего не выйдет. Но советую ставить другие символы, можно в начале строки или в середине.
 
//При этом необходимо увеличить длину поля password в базе. Зашифрованный пароль может получится гораздо большего размера.
 
 
$result = mysql_query("SELECT * FROM users WHERE login='$login' AND password='$password' AND activation='1'",$db); //извлекаем из базы все данные о пользователе с введенным логином
//мы дописали «AND activation='1'», то есть пользователь будет искаться только среди активированных. Желательно добавить это условие к другим подобным проверкам данных пользователя
$myrow = mysql_fetch_array($result);
 
if (empty($myrow['id']) )
{
//если пользователя с введенным логином и паролем не существует,то записываем ip пользователя и с датой ошибки
 
    $select = mysql_query ("SELECT ip FROM oshibka WHERE ip='$ip'");
    $tmp = mysql_fetch_row ($select);
    if ($ip == $tmp[0]) {
        //проверяем, есть ли пользователь в таблице "oshibka"
        $result52 = mysql_query("SELECT col FROM oshibka WHERE ip='$ip'",$db);
        $myrow52 = mysql_fetch_array($result52);
 
        $col = $myrow52[0] + 1;//Если есть,то приплюсовываем количесво 
        mysql_query ("UPDATE oshibka SET col=$col,date=NOW() WHERE ip='$ip'");
    }
 
    else {
        //если за последние 15 минут ошибок не было, то вставляем новую запись в таблицу "oshibka"
        mysql_query ("INSERT INTO oshibka (ip,date,col) VALUES ('$ip',NOW(),'1')");
    }
 
    exit ("Извините, введённый вами логин или пароль неверный."); //останавливаем выполнение сценариев
 
}
else {
 
          //если пароли совпадают, то запускаем пользователю сессию! Можете его поздравить, он вошел!
        $_SESSION['password']=$myrow['password']; 
    $_SESSION['login']=$myrow['login']; 
        $_SESSION['id']=$myrow['id'];//эти данные очень часто используются, вот их и будет "носить с собой" вошедший пользователь
 
 
    $ip=$_SERVER['REMOTE_ADDR']; 
    if( $ip != $myrow['ip'] ){ // если ip не совпадает
        $id = $myrow['id'];
        $result4 = mysql_query("UPDATE users SET ip='$ip' WHERE id='$id'",$db); // сохраняем ip в базу данных  
    }
 
 
    //Далее мы запоминаем данные в куки, для последующего входа.
    //ВНИМАНИЕ!!! ДЕЛАЙТЕ ЭТО НА ВАШЕ УСМОТРЕНИЕ, ТАК КАК ДАННЫЕ ХРАНЯТСЯ В КУКАХ БЕЗ ШИФРОВКИ
 
/*  if (isset($_POST['save'])){
        //Если пользователь хочет, чтобы его данные сохранились для последующего входа, то сохраняем в куках его браузера
        setcookie("login", $_POST["login"], time()+9999999);
        setcookie("password", $_SESSION['password'], time()+9999999);
        setcookie("id", $myrow['id'], time()+9999999);
    }*/
 
//  if (isset($_POST['autovhod'])){
        //Если пользователь хочет входить на сайт автоматически
        setcookie("auto", "yes", time()+9999999);
        setcookie("login", $_POST["login"], time()+9999999);
        setcookie("password", $_SESSION['password'], time()+9999999);
        setcookie("id", $myrow['id'], time()+9999999);
//  }
}   
 
echo "<html><head><meta http-equiv='Refresh' content='0; URL=index.php'></head></html>";
 
//перенаправляем пользователя на главную страничку, там ему и сообщим об удачном входе
 
?>
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.06.2013, 11:36
Ответы с готовыми решениями:

Перезагрузка линукс с зашифрованным паролем
как в шеле реализовать перезагрузку, без отображения в коде самого пароля? Допустим я запускаю шел от ими пользователя ТЕСТ. Можно будет...

Стандартная регистрация проблемы с паролем
Не подскажите ли уважаемые? Проблема такая: Делаю регистрацию через стандартные средства: ASP.NET Configuration...

Cookie и скрипты на сайте (регистрация)
пытаюсь написать программу для регистрации на сайте достаточно популярной онлайн игры... суть в чем, отправляю гет запрос получаю на него...

6
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
12.06.2013, 11:45
В куках пароль не хранят.
А если ИП изменится у пользователя? Ему опять авторизовываться?
У меня при каждом входе в интернет меняется ИП.

Добавлено через 1 минуту
Ну и ещё такой момент, IP передаётся на уровне протокола TCP/IP.
В его заголовке.
Не что не мешает злоумышленнику и ИП свой подменить, раз он смог куки украсть
0
157 / 2 / 1
Регистрация: 18.07.2011
Сообщений: 10
12.06.2013, 12:52  [ТС]
Цитата Сообщение от DrobyshevAlex Посмотреть сообщение
В куках пароль не хранят
Может подскажешь тогда где взять нормальную регистрацию? Я сам не смогу написать.

Цитата Сообщение от DrobyshevAlex Посмотреть сообщение
А если ИП изменится у пользователя? Ему опять авторизовываться?
У меня при каждом входе в интернет меняется ИП.
Я хочу сделать сайт типа вконтакте на ajax, так что те кто на модемном соединении вряд ли смогут им пользоваться.

Цитата Сообщение от DrobyshevAlex Посмотреть сообщение
Не что не мешает злоумышленнику и ИП свой подменить
Это возможно? Извините, я не сильно в этом разбираюсь.
0
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
12.06.2013, 13:10
Цитата Сообщение от vvd37 Посмотреть сообщение
так что те кто на модемном соединении вряд ли смогут им пользоваться.
у меня ADSL скорость 21 мегабит.
и динамический ИП. Пол страны по LAN сидят, там многие дома с серым ИП, то есть 1 общий ИП на тысячи юзеров.

Цитата Сообщение от vvd37 Посмотреть сообщение
Я сам не смогу написать.
Цитата Сообщение от vvd37 Посмотреть сообщение
Я хочу сделать сайт типа вконтакте на ajax,
Не кажется ли вам, это не совместимыми высказываниями?

Возьмите готовую CMS, будет проще.
0
157 / 2 / 1
Регистрация: 18.07.2011
Сообщений: 10
12.06.2013, 13:49  [ТС]
Я сам не смогу написать
Это я имел ввиду что не смогу сделать регистрацию с нуля, не зная даже что можно хранить в куках, а что нельзя. Тем более, что есть готовые регистрации в интернете. Вот я и спрашиваю, может кто-нибудь знает где лежит хорошая регистрация?



Цитата Сообщение от DrobyshevAlex Посмотреть сообщение
Пол страны по LAN сидят, там многие дома с серым ИП, то есть 1 общий ИП на тысячи юзеров.
Тогда чтобы совершить кражу пароля надо чтобы и хакер и жертва оказались под одним ip. Это сужает возможности хакера.
0
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
12.06.2013, 13:52
Я не о том, я о том что у людей у многих меняется ИП, например ростелеком во многих регионах, в ростове и краснодаре меняется
0
157 / 2 / 1
Регистрация: 18.07.2011
Сообщений: 10
12.06.2013, 14:21  [ТС]
Те кто сидят по локальным сетям, они же имеют фиксированный ip, один на тысячу. Я правильно понимаю?
А те у кого динамический ip не смогут пользоваться сайтом. Вернее они смогут его читать. Но не смогут зарегистрировавшись входить.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.06.2013, 14:21
Помогаю со студенческими работами здесь

Проблема с зашифрованным диском на ноутбуке.
Привет всем. У знакомого есть ноутбук отдали знакомые с работы и хочется ему посмотреть что на нём осталось. Проблема в том что...

Работа с зашифрованным SQLite-файлом
Здравствуйте! Подскажите пожалуйста, как организовать работу со своим зашифрованным SQLite-файлом? Какие библиотеки посоветуете?

Восстановление данных с карты с зашифрованным разделом на андроид 6.0.1
Имеется смартфон с андроид 6.0.1, недавно сбросил телефон до заводских настроек и теперь он не хочет читать sd-карту. Нашел инструкцию в...

Почему Cookie в куки заносится значение, а в другом файле Cookie пуста?
Здравствуйте подскажите что я не так делаю все вроде по примерам да ошибок как токавых нет.. но не получается задуманное хочу сделать...

Кнопка с фиксацией
Доброго времени суток! Требуется сделать кнопку с фиксацией. Фиксация должна идентифицироваться как визуально, так и программно, через...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru