PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
medensev
Отправлено: 11 Марта, 2012 - 13:52:37
Post Id



Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Февр. 2012  
Откуда: Орел


Помог: 0 раз(а)




Доброго время суток =)

Хочу предложить вашему вниманию открытый код php регистрации и авторизации через протокол sms. В сети очень мало информации можно найти на эту тему, ниже будет представлен код и sql запрос. И так начнем!

Для начало создадим базу данных и назовем ее reg, вы можете назвать ее как хотите на ваше усмотрения.
Создали базу? Далее выполним sql запрос

CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE `users` (
  2. `user_id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `user_login` varchar(30) NOT NULL,
  4. `user_password` varchar(32) NOT NULL,
  5. `user_hash` varchar(32) NOT NULL,
  6. `user_ip` int(10) UNSIGNED NOT NULL DEFAULT '0',
  7. PRIMARY KEY (`user_id`)
  8. ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;
  9.  


Далее создаем файл register.php и в него пишем этот код

PHP:
скопировать код в буфер обмена
  1. <?
  2. // Страница регситрации нового пользователя
  3.  
  4. # Соединямся с БД
  5. mysql_connect("localhost", "пользователь бд", "пароль бд");
  6.  
  7.  
  8. if(isset($_POST['submit']))
  9. {
  10.     $err = array();
  11.  
  12.     # проверям логин (в место логина будет номер мобильного)
  13.    if(!preg_match("/^[0-9]+$/",$_POST['login']))
  14.     {
  15.         $err[] = "Логин может состоять только из цифр";
  16.     }
  17.    
  18.     if(strlen($_POST['login']) < 3 or strlen($_POST['login']) > 30)
  19.     {
  20.         $err[] = "Логин должен быть не меньше 3-х символов и не больше 30"; //здесь ставите лимит на свой выбор
  21.     }
  22.    
  23.     # проверяем, не сущестует ли пользователя с таким именем
  24.    $query = mysql_query("SELECT COUNT(user_id) FROM users WHERE user_login='".mysql_real_escape_string($_POST['login'])."'");
  25.     if(mysql_result($query, 0) > 0)
  26.     {
  27.         $err[] = "Пользователь с таким номером уже существует в базе данных";
  28.     }
  29.    
  30.     # Если нет ошибок, то добавляем в БД нового пользователя
  31.    if(count($err) == 0)
  32.     {
  33.        
  34.         $login = $_POST['login'];
  35.         require_once "sms.php";
  36.        
  37.         function generate_pass($number)
  38.       {
  39.         $arr = array('a','b','c','d','e','f',
  40.                      'g','h','i','j','k','l',
  41.                      'm','n','o','p','r','s',
  42.                      't','u','v','x','y','z',
  43.                      '1','2','3','4','5','6',
  44.                      '7','8','9','0');
  45.                      
  46.         // Генерируем пароль для смс
  47.         $pass = "";
  48.         for($i = 0; $i < $number; $i++)
  49.         {
  50.           // Вычисляем произвольный индекс из массива
  51.           $index = rand(0, count($arr) - 1);
  52.           $pass .= $arr[$index];
  53.         }
  54.         return $pass;
  55.       }
  56.        
  57.       $newpass = generate_pass(6);
  58.      
  59.        
  60.        
  61.         # Убераем лишние пробелы и делаем двойное шифрование
  62.        // $password = md5(md5(trim('')));
  63.          $str = "$newpass";
  64.          $pass1 = md5(md5($str));
  65.  
  66.        
  67.         mysql_query("INSERT INTO users SET user_login='".$login."', user_password='".$pass1."'");
  68.        
  69.         $smssend = send("api.smsfeedback.ru", 80, "Логин", "Пароль",
  70.             "$login", "$newpass", "TEST-SMS");
  71. // чтобы получить логин и пароль нужно зарегистрироваться тут smsfeedback.ru
  72.  
  73.         header("Location: login.php"); exit();
  74.     }
  75.     else
  76.     {
  77.         print "<b>При регистрации произошли следующие ошибки:</b><br>";
  78.         foreach($err AS $error)
  79.         {
  80.             print $error."<br>";
  81.         }
  82.     }
  83. }
  84. ?>
  85.  
  86. # Напишем форму
  87. <form method="POST">
  88. Номер телефона + <input name="login" type="text"><br>
  89. <input name="submit" type="submit" value="Зарегистрироваться">
  90. </form>


Далее создадим файл и назовем его login.php

PHP:
скопировать код в буфер обмена
  1. <?
  2. // Страница авторизации
  3.  
  4.  
  5. # Функция для генерации случайной строки
  6. function generateCode($length=6) {
  7.     $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHI JKLMNOPRQSTUVWXYZ0123456789";
  8.     $code = "";
  9.     $clen = strlen($chars) - 1;  
  10.     while (strlen($code) < $length) {
  11.             $code .= $chars[mt_rand(0,$clen)];  
  12.     }
  13.     return $code;
  14. }
  15.  
  16.  
  17. # Соединямся с БД
  18. mysql_connect("localhost", "Пользователь бд", "Пароль бд");
  19.  
  20. if(isset($_POST['submit']))
  21. {
  22.     # Вытаскиваем из БД запись, у которой логин равняеться введенному
  23.    $query = mysql_query("SELECT user_id, user_password FROM users WHERE user_login='".mysql_real_escape_string($_POST['login'])."' LIMIT 1");
  24.     $data = mysql_fetch_assoc($query);
  25.    
  26.     # Соавниваем пароли
  27.    if($data['user_password'] === md5(md5($_POST['password'])))
  28.     {
  29.         # Генерируем случайное число и шифруем его
  30.        $hash = md5(generateCode(10));
  31.            
  32.         if(!@$_POST['not_attach_ip'])
  33.         {
  34.             # Если пользователя выбрал привязку к IP
  35.            # Переводим IP в строку
  36.            $insip = ", user_ip=INET_ATON('".$_SERVER['REMOTE_ADDR']."')";
  37.         }
  38.        
  39.         # Записываем в БД новый хеш авторизации и IP
  40.        mysql_query("UPDATE users SET user_hash='".$hash."' ".$insip." WHERE user_id='".$data['user_id']."'");
  41.        
  42.         # Ставим куки
  43.        setcookie("id", $data['user_id'], time()+60*60*24*30);
  44.         setcookie("hash", $hash, time()+60*60*24*30);
  45.        
  46.         # Переадресовываем браузер на страницу проверки нашего скрипта
  47.        header("Location: check.php"); exit();
  48.     }
  49.     else
  50.     {
  51.         print "Вы ввели неправильный логин/пароль";
  52.     }
  53. }
  54. ?>
  55.  #форма авторизации
  56. <form method="POST">
  57. Номер  <input name="login" type="text"><br>
  58. Пароль <input name="password" type="password"><br>
  59. Не прикреплять к IP(не безопасно) <input type="checkbox" name="not_attach_ip"><br>
  60. <input name="submit" type="submit" value="Войти">
  61. </form>


Далее создадим файл sms.php

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.          
  3. /*
  4. * функция передачи сообщения
  5. */
  6.  
  7. function send($host, $port, $login, $password, $phone, $text, $sender = false, $wapurl = false )
  8. {
  9.     $fp = fsockopen($host, $port, $errno, $errstr);
  10.     if (!$fp) {
  11.         return "errno: $errno \nerrstr: $errstr\n";
  12.     }
  13.     fwrite($fp, "GET /send/" .
  14.         "?phone=" . rawurlencode($phone) .
  15.         "&text=" . rawurlencode($text) .
  16.         ($sender ? "&sender=" . rawurlencode($sender) : "") .
  17.         ($wapurl ? "&wapurl=" . rawurlencode($wapurl) : "") .
  18.         "  HTTP/1.0\n");
  19.     fwrite($fp, "Host: " . $host . "\r\n");
  20.     if ($login != "") {
  21.         fwrite($fp, "Authorization: Basic " .
  22.             base64_encode($login. ":" . $password) . "\n");
  23.     }
  24.     fwrite($fp, "\n");
  25.     $response = "";
  26.     while(!feof($fp)) {
  27.         $response .= fread($fp, 1);
  28.     }
  29.     fclose($fp);
  30.     list($other, $responseBody) = explode("\r\n\r\n", $response, 2);
  31.     return $responseBody;
  32. }
  33.  
  34. ?>


Создадим файл проверку check.php

PHP:
скопировать код в буфер обмена
  1. <?
  2. // Скрипт проверки
  3.  
  4. # Соединямся с БД
  5. mysql_connect("localhost", "пользователь бд", "пароль бд");
  6.  
  7. if (isset($_COOKIE['id']) and isset($_COOKIE['hash']))
  8. {  
  9.     $query = mysql_query("SELECT *,INET_NTOA(user_ip) FROM users WHERE user_id = '".intval($_COOKIE['id'])."' LIMIT 1");
  10.     $userdata = mysql_fetch_assoc($query);
  11.  
  12.     if(($userdata['user_hash'] !== $_COOKIE['hash']) or ($userdata['user_id'] !== $_COOKIE['id'])
  13.  or (($userdata['user_ip'] !== $_SERVER['REMOTE_ADDR'])  and ($userdata['user_ip'] !== "0")))
  14.     {
  15.         setcookie("id", "", time() - 3600*24*30*12, "/");
  16.         setcookie("hash", "", time() - 3600*24*30*12, "/");
  17.         print "Хм, что-то не получилось";
  18.     }
  19.     else
  20.     {
  21.         print "Привет, ".$userdata['user_login'].". Всё работает!";
  22.     }
  23. }
  24. else
  25. {
  26.     print "Включите куки";
  27. }
  28. ?>


Так же можете красиво и аккуратно распределить формы и настройки в других файлов, фантазируйте!
На этом все =)
Комментируйте, дополняйте. Буду весьма признателен за исправления и дополнения!
 
 Top
alkrav
Отправлено: 30 Января, 2013 - 14:11:01
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Янв. 2013  


Помог: 0 раз(а)




Отлично, всё работает. Вот только получается что человек однажды зарегистрировался и получил смску с паролем, а потом он не может восстановить пароль тем же способом, чтобы попасть внутрь. То есть можно было бы сделать так, что добавляя человека с юзеры пароль ему генерировался бы каждый раз при входе. Нужно было бы вводить лишь телефон.
 
 Top
ankokel
Отправлено: 11 Апреля, 2018 - 21:34:53
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Апр. 2018  


Помог: 0 раз(а)




Почему на номер телефона не приходит смс с паролем?
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« HTTP и PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB