Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2009, 00:22   #1
bloger
Пользователь
 
Регистрация: 19.11.2009
Сообщений: 12
По умолчанию Куки в авторизации

Поставил авторизацию а она не работает жалуется на куки.А точнее print "Хм, что-то не получилось";.Помогите разобратся.

Login.php

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;
}

if(isset(
$_POST['submit']))
{
    
# Вытаскиваем из БД запись, у которой логин равняеться введенному
    
$query mysql_query("SELECT id, password FROM users WHERE login='".mysql_real_escape_string($_POST['login'])."' LIMIT 1");
    
$data mysql_fetch_assoc($query);
    
    
# Соавниваем пароли
    
if($data['password'] == md5(md5($_POST['password']))) 
    {
        
# Генерируем случайное число и шифруем его
        
$hash md5(generateCode(10));
            
        if(!@
$_POST['ip'])
        {
            
# Если пользователя выбрал привязку к IP
            # Переводим IP в строку
            
$insip ", ip=INET_ATON('".$_SERVER['REMOTE_ADDR']."')";
        }
        
        
# Записываем в БД новый хеш авторизации и IP
        
mysql_query("UPDATE users SET hash='".$hash."' ".$insip." WHERE id='".$data['id']."'");
        
        
# Ставим куки
        
setcookie("id"$data['id'], time()+60*60*24*30);
        
setcookie("hash"$hashtime()+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="ip"><br>
<input name="submit" type="submit" value="Войти">
</form>

check.php

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

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

    if((
$userdata['hash'] != $_COOKIE['hash']) or ($userdata['id'] != $_COOKIE['id'])
 or ((
$userdata['ip'] != $_SERVER['REMOTE_ADDR'])  and ($userdata['ip'] != "1")))
    {
        
setcookie("id"""time() - 3600*24*30*12"/");
        
setcookie("hash"""time() - 3600*24*30*12"/");
        print 
"Хм, что-то не получилось";
    }
    else
    {
        print 
"Привет, ".$userdata['login'].". Всё работает!";
    }
}
else
{
    print 
"Включите куки";
}
?>
bloger вне форума Ответить с цитированием
Старый 19.11.2009, 01:02   #2
QunneD
C++ &amp;amp; PHP &amp;amp; Asm
Форумчанин
 
Аватар для QunneD
 
Регистрация: 06.12.2008
Сообщений: 300
По умолчанию

Цитата:
print "Хм, что-то не получилось";
Точную ошибку которую PHP выдает дай.
QunneD вне форума Ответить с цитированием
Старый 19.11.2009, 08:22   #3
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,150
По умолчанию

похоже в логике что-то
PHP код:
if(($userdata['hash'] != $_COOKIE['hash']) or ($userdata['id'] != $_COOKIE['id']) 
 or ((
$userdata['ip'] != $_SERVER['REMOTE_ADDR'])  and ($userdata['ip'] != "1"))) 
на экран все переменные что в стравнении выводите - и смотрите ... где не выполняется условие и какие значения кук
ADSoft вне форума Ответить с цитированием
Старый 19.11.2009, 11:38   #4
bloger
Пользователь
 
Регистрация: 19.11.2009
Сообщений: 12
По умолчанию

Ошибки то нет.Просто когда вводишь правильный логин и пароль всегда появляется вот это Хм, что-то не получилось, а нада чтобы Привет, ".$userdata['login'].". Всё работает!
bloger вне форума Ответить с цитированием
Старый 19.11.2009, 12:06   #5
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,150
По умолчанию

Цитата:
Сообщение от bloger Посмотреть сообщение
Ошибки то нет.Просто когда вводишь правильный логин и пароль всегда появляется вот это Хм, что-то не получилось, а нада чтобы Привет, ".$userdata['login'].". Всё работает!
говорю же... значит выполняется общее условие в if .... а какое имеено - надо смотреть - ввыводя эти переменные
ADSoft вне форума Ответить с цитированием
Старый 19.11.2009, 15:37   #6
QunneD
C++ &amp;amp; PHP &amp;amp; Asm
Форумчанин
 
Аватар для QunneD
 
Регистрация: 06.12.2008
Сообщений: 300
По умолчанию

Цитата:
говорю же... значит выполняется общее условие в if .... а какое имеено - надо смотреть - ввыводя эти переменные
Поддерживаю
QunneD вне форума Ответить с цитированием
Старый 19.11.2009, 17:56   #7
bloger
Пользователь
 
Регистрация: 19.11.2009
Сообщений: 12
По умолчанию

Проверел все переменные выводятся.Но по прежнему не нашол ошибки.
bloger вне форума Ответить с цитированием
Старый 19.11.2009, 18:41   #8
Metandrostenalon
Форумчанин
 
Регистрация: 03.04.2009
Сообщений: 108
По умолчанию

последнее условие наверно лишнее
php,javascript
Metandrostenalon вне форума Ответить с цитированием
Старый 20.11.2009, 08:13   #9
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,150
По умолчанию

Цитата:
Сообщение от bloger Посмотреть сообщение
Проверел все переменные выводятся.Но по прежнему не нашол ошибки.
конечно будут выводится... вопрос в том чтобы выводя переменные используемые в условии - проверить логическую цепочку..... что выолняется в условии что нет - тогда будет полная картина....
по поводу того что последнее сравнение ИП адреса с 1 ненужно... - хз... автора скрипта нада спрашивать - какой там тайный смысл .... но так как (1) или (2) а ип сравнение в (2) ... то в принципе достаточно отследить что в (1) происходит
PHP код:
echo '1='.$userdata['hash'];
echo 
'2='.$_COOKIE['hash']) 
итд 
сделайте вывод и смотрите - реально ли совпадает

а по ИП - точно вот ошибка есть
в селекте выбираете INET_NTOA(ip) - а сравниваете $userdata['ip'], тогда или алиас вводите
или сравнивайте $userdata['INET_NTOA(ip)']

Последний раз редактировалось ADSoft; 20.11.2009 в 08:17.
ADSoft вне форума Ответить с цитированием
Старый 21.11.2009, 01:18   #10
Android_ua
Пользователь
 
Регистрация: 02.11.2009
Сообщений: 11
По умолчанию

Насколько я понял, то сервер ругается на то что параметры хедера уже выставлены, и по этому setcookie() надо ставить в самое начало кода, а именно перед тегом <html> и какими нибудь другими тегами.
Я это сделал так
PHP код:
<?php
include('blocks/db.php');
if (isset(
$_POST['login'])) { $login $_POST['login']; if (empty($login)) { unset($login);} } 
if (isset(
$_POST['password'])) { $password=$_POST['password']; if (empty($password)) { unset($password);} }
if (!isset(
$login) or !isset($password))
    {
    
$error = ("<h1>Вы ввели не всю информацию, пожалуйста заполните все поля!</h1>");
    }
    
$login    stripslashes($login);
    
$login    htmlspecialchars($login);
    
$password stripslashes($password);
    
$password htmlspecialchars($password);
//удаляем лишние пробелы
    
$login    trim($login);
    
$password trim($password);

    
$password md5($password);//шифруем пароль    
if (!empty($login) and !empty($password))
    {
    
$check mysql_query("SELECT pass FROM users WHERE login='$login'",$db);
    
$check_row mysql_fetch_array($check);
        if(empty(
$check) or $check_row['pass'] != $password)
        {
         
$error = ("<h1>Вы ввели неверный логин и/или пароль, пожалуйста попробуйте снова!</h1>");
        }
        else
        {
         
$success = ("<h1>Поздравляем, вы успешно вошли в систему, ваш логин <strong>".$login."</strong>! <br /> Вы будете перенаправлены на предыдущую страницу через 3 секунды");
         
$message $success;//потом просто выводим в текстовом блоке
         
setcookie("login"$logintime()+9999999);
         
setcookie("password"$passwordtime()+9999999);
        }
    }
$referer $_SERVER['HTTP_REFERER'];
?>
P.S. Для того что-бы выводить сообщения разного рода(например "вы авторизированы" или "логин и пароль неверны") - я после проверки эти сообщения ввел в переменную $message, а потом в html коде уже выводил сообщение посредством оператора echo

Последний раз редактировалось Android_ua; 21.11.2009 в 01:21.
Android_ua вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не ставятся куки lanzs PHP 2 17.09.2009 22:36
Инди не принимает куки schnaps Работа с сетью в Delphi 2 14.07.2009 16:18
Куки Kinematik Работа с сетью в Delphi 0 27.12.2008 04:53
Проблема с передачей куки arwm Работа с сетью в Delphi 7 28.12.2007 23:44
Alert и куки Fox JavaScript, Ajax 0 02.11.2006 23:16