За последние 24 часа нас посетили 17969 программистов и 1653 робота. Сейчас ищут 1554 программиста ...

Авторизация?

Тема в разделе "Решения, алгоритмы", создана пользователем Sevkov, 17 дек 2012.

  1. Sevkov

    Sevkov Активный пользователь

    С нами с:
    17 дек 2012
    Сообщения:
    2
    Симпатии:
    0
    Добрый день,

    Нужно написать авторизацию для корпоративной базы данных, с валидацией через SMS.
    Я не профессионал в PHP, покритикуйте, пожалуйста, моё решение.

    Код (PHP):
    1. <?php
    2.  
    3. include('sms.class.php');
    4. include ('bd.php');
    5.  
    6. $ip = $_SERVER["REMOTE_ADDR"]; 
    7.  
    8. $username = $_POST['login'];
    9. $password = $_POST['password'];
    10.  
    11. $passw = md5($password);
    12.  
    13. $db = new database('localhost', 'login', 'password', 'base');
    14.  
    15. $attemptsip = $db->select("SELECT attempts FROM attempts WHERE ip='$ip'");    //смотрим количество обращений с IP
    16.  
    17. $userdata = array();
    18. $userdata = $db->select("SELECT * FROM users WHERE username='$username'");
    19.  
    20. if (!$attemptsip) {    //если пусто, то присваеваем ноль
    21.     $attemptsip[0]['attempts'] = '0';
    22. }
    23.  
    24. if ($attemptsip[0]['attempts'] >= 5) {    //если попыток пять или больше, то выдаем ответ и прибиваем скрипт
    25.     if (!$userdata) {    //если пользователь не найден
    26.         exit("Ваш IP заблокирован");
    27.     }
    28.     if ($userdata[0]['active'] == 0) {
    29.         exit("Ваши IP и логин заблокированы");
    30.     }
    31.     exit("Ваш IP заблокирован");
    32. }
    33.  
    34. if (!$userdata) {  //если логин не найден
    35.  
    36.     if ($attemptsip[0]['attempts'] == 0) {    //если такого IP ещё нету
    37.     
    38.         $db->query("INSERT INTO `attempts` (`username`, `ip`, `attempts`) VALUES ('$username', '$ip', '1')");    //то добавляем его с юзернэймом
    39.         $increment = 1;
    40.         
    41.     } else {    //если такой IP уже есть
    42.     
    43.         $increment = $attemptsip[0]['attempts'] + 1;    //получаем количество попыток из базы
    44.         $db->query("UPDATE attempts SET attempts='$increment' WHERE ip='$ip'");    //и прибавляем одну
    45.         if ($increment == 5) {    //когда количество попыток достигает пяти, выводим сообщение            
    46.             exit("Ваш IP заблокирован");
    47.         }
    48.         
    49.         $remain = 5 - $increment;    //подсчитываем количество оставшихся попыток
    50.         exit("Неверный пароль. Осталось попыток: $remain");
    51.         
    52.     }
    53.     
    54.     $remain = 5 - $increment;    //подсчитываем количество оставшихся попыток
    55.     exit("Неверный пароль. Осталось попыток: $remain");
    56.  
    57. }
    58.  
    59. function generateCode($length=6) {    //генераторка хэшей
    60.  
    61.     $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHI JKLMNOPRQSTUVWXYZ0123456789";
    62.     $code = "";
    63.     $clen = strlen($chars) - 1;  
    64.     while (strlen($code) < $length) {
    65.         $code .= $chars[mt_rand(0,$clen)];  
    66.     }
    67.  
    68.     return $code;
    69.  
    70. }
    71.  
    72. if ($userdata[0]['password'] == $passw) {    //если пароль подходит
    73.     
    74.     if ($userdata[0]['active'] == 0) {    //проверяем, не заблокирован ли юзер
    75.         exit("Ваш логин заблокирован");    //если заблокирован, выводим сообщение и прибиваем скрипт
    76.     }
    77.     
    78.     echo "Success";
    79.     
    80.     $db->query("UPDATE attempts SET attempts='0' WHERE ip='$ip'");
    81.     
    82.     $hash = md5(generateCode(10));
    83.     setcookie ("hash", $hash, time() + 3600);    //ставим cookies
    84.     $time = time();
    85.     $vercode = rand(100000, 999999);
    86.     
    87.     $db->query("INSERT INTO `sessions` (`username`, `cookies`, `time`, `code`) VALUES ('$username', '$hash', '$time', '$vercode')");    //записываем идентификаторы в базу
    88.     
    89.     $mobile = $userdata[0]['phone'];
    90.     $msgopt = array(
    91.         'Phone' => $mobile,
    92.         'Text' => $vercode,
    93.         'From' => 'UCP.BASE'
    94.         );
    95.     $Sms = new SMSClass('login', 'password');
    96.     $message = $Sms->SendSMS(array($msgopt));
    97.     
    98. } else {  //если пароль не подходит
    99.  
    100.     if ($attemptsip[0]['attempts'] == 0) {    //если такого IP ещё нету
    101.     
    102.         $db->query("INSERT INTO `attempts` (`username`, `ip`, `attempts`) VALUES ('$username', '$ip', '1')");    //то добавляем его с юзернэймом
    103.         $increment = 1;
    104.         
    105.     } else {    //если такой IP уже есть
    106.     
    107.         $increment = $attemptsip[0]['attempts'] + 1;    //получаем количество попыток из базы
    108.         $db->query("UPDATE attempts SET attempts='$increment' WHERE ip='$ip'");    //и прибавляем одну
    109.         if ($increment == 5) {    //когда количество попыток достигает пяти, выводим сообщение
    110.             $db->query("UPDATE users SET active='0' WHERE username='$username'");    //и вырубаем учётку
    111.             exit("Ваши IP и логин заблокированы");
    112.         }
    113.         
    114.         $remain = 5 - $increment;    //подсчитываем количество оставшихся попыток
    115.         exit("Неверный пароль. Осталось попыток: $remain");
    116.         
    117.     }
    118.     
    119.     $remain = 5 - $increment;    //подсчитываем количество оставшихся попыток
    120.     exit("Неверный пароль. Осталось попыток: $remain");
    121.  
    122. }    
    123.  
    124. ?> 
     
  2. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    критикую: писта твоей конторе ))))
     
  3. Sevkov

    Sevkov Активный пользователь

    С нами с:
    17 дек 2012
    Сообщения:
    2
    Симпатии:
    0
    А подробнее? :)
     
  4. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    скрипт подвержен SQL инъекциям. т.е. злой школьник даже , сможет делать с БД все что угодно. украсть, удалить, модифицировать, зайти под админом и т.д. читайте в гугле что это и как починить.
     
  5. MaXyC_Web_Studio

    MaXyC_Web_Studio Активный пользователь

    С нами с:
    31 дек 2006
    Сообщения:
    678
    Симпатии:
    3
    Адрес:
    Новоуральск
    да и программист задающий такие вопросы отвечающий за корпоративную базу данных, в компании, которая готова платить за смски, но не готовая взять нормального программиста... пздц
     
  6. kowapos

    kowapos Активный пользователь

    С нами с:
    18 янв 2013
    Сообщения:
    120
    Симпатии:
    0
    че на парня кинулись?
    замени
    свое на это
    htmlspecialchars вроде фильтрует <,>,',".
    а trim убирает лишние пробелы пробелы

    Добавлено спустя 2 минуты 48 секунд:
    для числовых делай так $num = abs(intval($_POST["$переменная"])):
     
  7. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    еще один ..... фильтрует оказывается....
    что значит "вроде"? ну возми и прочитай описание функции. сразу узнаешь что она делает на самом деле.
    а когда прочитаешь подумай, зачем использовать функцию созданную для обработки HTML - в месте подготовки данных для SQL запроса?
    зачем делать операцию на глазах через жопу - со стороны лица удобнее же, нет?