Ошибка в проверки

Тема в разделе "PHP", создана пользователем sasha14486, 25 окт 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. sasha14486

    sasha14486 Создатель

    Регистр.:
    27 июл 2008
    Сообщения:
    24
    Симпатии:
    0
    Вот рабочая авторизация,но в файле проверки check.php происходит ошибка print "Хм, что-то не получилось";
    Непойму токо почему она там случается,помогите исправить.

    PHP:
    login.php

    <?
    // Страница авторизации


    # Функция для генерации случайной строки
    function generateCode($length=6) {
    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHI JKLMNOPRQSTUVWXYZ0123456789";
    $code = "";
    $clen = strlen($chars) - 1;
    while (strlen($code) < $length) {
    $code .= $chars[mt_rand(0,$clen)];
    }
    return $code;
    }


    # Соединямся с БД
    mysql_connect("localhost", "****", "*****");
    mysql_select_db("testblog");

    if(isset($_POST['submit']))
    {
    # Вытаскиваем из БД запись, у которой логин равняеться введенному
    $query = mysql_query("SELECT user_id, user_password FROM users WHERE user_login='".mysql_real_escape_string($_POST['login'])."' LIMIT 1");
    $data = mysql_fetch_assoc($query);

    # Соавниваем пароли
    if($data['user_password'] === md5(md5($_POST['password'])))
    {
    # Генерируем случайное число и шифруем его
    $hash = md5(generateCode(10));

    if(!@$_POST['not_attach_ip'])
    {
    # Если пользователя выбрал привязку к IP
    # Переводим IP в строку
    $insip = ", user_ip=INET_ATON('".$_SERVER['REMOTE_ADDR']."')";
    }

    # Записываем в БД новый хеш авторизации и IP
    mysql_query("UPDATE users SET user_hash='".$hash."' ".$insip." WHERE user_id='".$data['user_id']."'");

    # Ставим куки
    setcookie("id", $data['user_id'], time()+60*60*24*30);
    setcookie("hash", $hash, time()+60*60*24*30);

    # Переадресовываем браузер на страницу проверки нашего скрипта
    header("Location: check.php"); exit();
    }
    else
    {
    print "Вы ввели неправильный логин/пароль";
    }
    }
    ?>
    <form method="POST">
    Логин <input name="login" type="text"><br>
    Пароль <input name="password" type="password"><br>
    Не прикреплять к IP(не безопасно) <input type="checkbox" name="not_attach_ip"><br>
    <input name="submit" type="submit" value="Войти">
    </form>



    check.php

    <?
    // Скрипт проверки

    # Соединямся с БД
    mysql_connect("localhost", "****", "****");
    mysql_select_db("testblog");

    if (isset($_COOKIE['id']) and isset($_COOKIE['hash']))
    {
    $query = mysql_query("SELECT *,INET_NTOA(user_ip) FROM users WHERE user_id = '".intval($_COOKIE['id'])."' LIMIT 1");
    $userdata = mysql_fetch_assoc($query);

    if(($userdata['user_hash'] !== $_COOKIE['hash']) or ($userdata['user_id'] !== $_COOKIE['id'])
    or (($userdata['user_ip'] !== $_SERVER['REMOTE_ADDR']) and ($userdata['user_ip'] !== "0")))
    {
    setcookie("id", "", time() - 3600*24*30*12, "/");
    setcookie("hash", "", time() - 3600*24*30*12, "/");
    print "Хм, что-то не получилось";
    }
    else
    {
    print "Привет, ".$userdata['user_login'].". Всё работает!";
    }
    }
    else
    {
    print "Включите куки";
    }
    ?> 

    На одном форуме спрашивал,но так ответа некто и не дал,может здесь поможете,буду очень всем благодарен за ответ.;)
     
  2. ZloiJoker

    ZloiJoker Создатель

    Регистр.:
    2 июн 2007
    Сообщения:
    33
    Симпатии:
    0
    Тут отлаживать надо вопрос что выводит: $userdata['user_ip'
     
  3. t0wer

    t0wer BlackHerald

    Регистр.:
    24 июн 2008
    Сообщения:
    735
    Симпатии:
    423
    по приведенному вашему коду сложно определить причину.
    смотрите что чему не равно и выводите эхом переменные для предварительного просмотра!!!
    причина в этом коде:
    PHP:
    if(($userdata['user_hash'] !== $_COOKIE['hash']) or ($userdata['user_id'] !== $_COOKIE['id'])
    or ((
    $userdata['user_ip'] !== $_SERVER['REMOTE_ADDR']) and ($userdata['user_ip'] !== "0")))
     
  4. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    890
    Симпатии:
    561
    В аське же ответил. Если не понятно- можно переспросить)
    PHP:
    ($userdata['user_id'] !== $_COOKIE['id']) лишнее ибо всегда равно
    Но Ошибка тут
    PHP:
    ($userdata['user_ip'] !== $_SERVER['REMOTE_ADDR']) 
    Почему? Ответ мускула user_ip содержит одну инфу а INET_NTOA(user_ip) совершенно другую

    + Ах, да исправляем говнокод тройные сравнения совернно тут не нужны. При них ещё проверяются типы переменных. Но в коде нет ни одного контроля типов.
    PHP:
    1==='1' // FALSE
    1===(int)'1' // TRUE
    1=='1'          // TRUE
     
Статус темы:
Закрыта.