За последние 24 часа нас посетили 17753 программиста и 1718 роботов. Сейчас ищут 964 программиста ...

Не авторизируется на сайте

Тема в разделе "PHP и базы данных", создана пользователем Maxximizer, 4 окт 2014.

  1. Maxximizer

    Maxximizer Новичок

    С нами с:
    4 окт 2014
    Сообщения:
    2
    Симпатии:
    0
    Вроде бы всё правильно сделано, в базе данных всё норм, а всё равно выдаёт "проверьте правильность введённых данных"
    Код скрипта
    Код (Text):
    1. <?php
    2. if(isset($_POST['nick'])) if(isset($_POST['pass']))
    3. {
    4.     $nick = $_POST['nick'];
    5.     $nick = stripslashes($nick);
    6.     $nick = htmlspecialchars($nick);
    7.     $nick = trim($nick);
    8.     $nick = substr($nick, 0, 16);
    9.    
    10.     $password = $_POST['pass'];
    11.     $password = stripslashes($password);
    12.     $password = htmlspecialchars($password);
    13.     $password = trim($password);
    14.     $password = substr($password, 0, 16);
    15.  
    16.     require('./bd.php');
    17.    
    18.     $nick = mysqli_real_escape_string($db, $nick);
    19.    
    20.     $query = mysqli_query($db, "SELECT `password`, `nick`, `id` FROM `players` WHERE `nick` = '$nick' LIMIT 1");
    21.     $result = mysqli_fetch_assoc($query);
    22.    
    23.     $crypt = SHA1($password.$nick);
    24.    
    25.     if ($result['password'] == $crypt)
    26.     {
    27.         echo 'ok';
    28.        
    29.         $_SESSION['nick'] = $result['nick'];
    30.         $_SESSION['pass'] = $result['pass'];
    31.        
    32.         setcookie('Nick', $nick,time() + 60 * 60 * 24 * 31 * 12);
    33.         setcookie('Password', $crypt, time() + 60 * 60 * 24 * 31 * 12);
    34.        
    35.         exit();
    36.     }
    37. }
    38. ?>
    сайт viceserver.ru
    Логин Maxximizer
    пароль 123123
    В чём может быть проблема?
     
  2. metadon

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

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    http://phpfaq.ru/debug "Отладка и поиск ошибок в своем алгоритме."
    Всё остальное тоже можно почитать.
     
  3. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    откуда знаешь? расскажи как ты это проверял.

    этого сообщения в приведенном коде нет. может быть ошибка там, где оно выдается? процитируй еще и тот кусок.

    stripslashes и htmlspecialchars здесь не нужны. записывать две куки вроде бы тоже незачем. а главное не видно как ты делаешь собственно авторизацию. то, что ты здесь показал это аутентификация.
     
  4. deblogger

    deblogger Новичок

    С нами с:
    11 июл 2013
    Сообщения:
    200
    Симпатии:
    0
    После такой санации вообще не войдешь. Начитаются галиматьи и пишут хз что.

    Правила же простые:

    1) если вы не выводите полученный текст - он может быть любым, даже таким <script>alert('I'm dunderhead')</script>. Как получили - так и записали.
    2) если вы выводите полученный текст - он должен быть безопасным, и тогда надо санировать, например через htmlentities();

    Запись в бд НЕ санируется, а просто готовится с учетом особенностей движка БД и свойств определенного поля. То есть все специальные символы которые engine понимает особо - надо закрыть от его внимания, и чтобы не было лишней возни с преобразованием типов и, чтобы не было воплей от движка, и чтобы всякие там кулцхаеры не лезли - строка заключается в кавычки, а числа не заключаются в кавычки. Если в поле где число попадет злобный текстовый запрос - движок разорется, вы его по Exception услышите и что надо юзеру скажете.

    Добавлено спустя 20 минут 5 секунд:
    Вот нашел

    Код (Text):
    1. $q = 'select * from `_users`
    2.     inner join `_user_role`
    3.     using(`user_role_id`)
    4.     where (`_user_role`.`flag` & '.$flag.')
    5.     and `_users`.`login` = "' . $_POST['login'] . '"
    6.     and `_users`.`pass` = password("' . $_POST['pass'] . '");';
    7.  
    8. // поскипано
    9.  
    10. if(!$r = $this->link->query($query, true))
    11.     return 0;
    Второй аргумент в этом методе - query($query, true) - обозначает что пойманную ошибку не надо выводить, а надо вернуть false если она произошла (а если не произошла, а просто нет такого юзера - то 0). Юзер должен ввести правильно свой логин-пароль, верно? - Значит если он ввел неправильно, или умышленно неправильно - должна произойти ошибка. Она должна произойти, иначе не поймешь правильно он ввел или неправильно. Так вот, а если я применю real_escape_string() то как узнаю что ввод был неправильный? Функция подготовит строку для БД, и получится что просто такого юзера нет в БД. То есть вместо идентификации ошибки синтаксиса я получу отсутствие ответа, то есть потеряю данные. Отсюда начинается та самая галиматься - перед подготовкой строки для БД начинают проверять правильная ли она, содержит ли, не содержит ли и все такое - чтобы не потерять эту самую информацию. Ну а особенные люди так вообще наворачивают на ввод хз что. :)