Авторизация на PHP. Как лучше сделать?

seosniks
На сайте с 13.08.2007
Offline
389
1565

Добрый вечер.

Хочу сделать авторизацию и регистрацию юзеров на сайте.

Посоветуйте пожалуйста нормальные методы.

Я пробовал сделать по этому методу http://habrahabr.ru/post/13726/

В форме есть чебокс который отключает привязку сессии к IP-адресу?

Так вот если я отключаю его, то выходит ошибка

авторизацию не пройти.

$data['ip'] !== $_SERVER['REMOTE_ADDR'])

если чек стоит то 127.0.0.1 !== 127.0.0.1 and 127.0.0.1 !==0

если чек снят выдает ошибку 0.0.0.0 !== 127.0.0.1 and 0.0.0.0 !==0

Ошибка в том,

что IP заносится только если чек стоит, если снять чек то поле IP пустое выдаст ошибку

Это что получается что код ошибочен?

ведь если чебокс снят то $data['ip'] не будет соответствовать условию.

izbushka
На сайте с 08.06.2007
Offline
110
#1

Выложите где-то свой код, а то вы, видимо, его изменили. На хабре ip в переменной $userdata['user_ip'] а у вас в $data['ip'], поэтому нет возможности понять что не так.

Что же касается логики, то вроде, там все правильно. Там проверяется либо совпадение IP (если вкл) либо равенство IP нулю (если выкл)

if(($userdata['user_hash'] !== $_COOKIE['hash']) or ($userdata['user_id'] !== $_COOKIE['id'])
or (($userdata['user_ip'] !== $_SERVER['REMOTE_ADDR']) and ($userdata['user_ip'] !== "0")))
{
print "Хм, что-то не получилось";
}

Т.е. если шех или ID не совпадают, ИЛИ если ip не совпадает И не равен 0 - авторизация не удалась

seosniks
На сайте с 13.08.2007
Offline
389
#2
izbushka:

Т.е. если шех или ID не совпадают, ИЛИ если ip не совпадает И не равен 0 - авторизация не удалась

Ну да код я подправил, но сути не меняет, я показал как пример.

Т.е. если шех или ID не совпадают, ИЛИ если ip не совпадает И не равен 0 - авторизация не удалась

Проблема как раз в IP. Не мойму почему он отдается как 0.0.0.0, хотя в базе он как 0

Вот что отдает var_dump

["user_ip"]=>

string(1) "0"

["ip"]=>

string(7) "0.0.0.0"

Алиас user_ip отдает пустой IP в виде нулей. Возможно в этом косяк. Щас попробую без использования алиаса as

Если взять код с хабра то получается тоже самое.

Если чебокс отключен то ошибка, потому как IP отдается в виде 0.0.0.0

а $_SERVER['REMOTE_ADDR'] содержит IP-адрес клиента

Может проблема в том что я все делаю на локалке?

Вот код


<?php

//тут коннект к базе

if (isset($_COOKIE['id']) and isset($_COOKIE['hash'])) // 73 de0a358242dc98c25aef080a849762cf
{
$query = mysql_query("SELECT *,INET_NTOA(user_ip) AS ip FROM `user` WHERE `us` = '".intval($_COOKIE['id'])."' LIMIT 1");
$userdata = mysql_fetch_assoc($query);


if(($userdata['user_hash'] !== $_COOKIE['hash']) or ($userdata['us'] !== $_COOKIE['us'])
or (($userdata['ip'] !== $_SERVER['REMOTE_ADDR']) and ($userdata['ip'] !=='0')))
{
setcookie("id", "", time() - 3600*24*30*12, "/");
setcookie("hash", "", time() - 3600*24*30*12, "/");
print "Ошибка:( Попробуй еще раз ";

?>
izbushka
На сайте с 08.06.2007
Offline
110
#3

А у вас в базе IP в каком виде: число или текст? Судя по этому

seosniks:
$query = mysql_query("SELECT *,INET_NTOA(user_ip) AS ip FROM `user` WHERE `us` = '".intval($_COOKIE['id'])."' LIMIT 1");

в числовом.

А зачем? Я бы в тексте и хранил.. Тогда INET_NTOA(user_ip) просто поменять на user_ip в SQL

Нужно посмотреть, как вы IP ложите в базу.

seosniks:
Не мойму почему он отдается как 0.0.0.0, хотя в базе он как 0

Может, поменяйте сравнение не с 0 а с '0.0.0.0' тогда.. Хотя лучше конечно полностью разобраться

Вобщем для полноты картины мне надо

результат запроса "desc user" и "select * from user" из базы и код, который ложит IP в базу

seosniks:
Может проблема в том что я все делаю на локалке?

исключено

seosniks
На сайте с 13.08.2007
Offline
389
#4

В общем все дело в в том что я алиас `ip` не обрамил кавычками, и мускул не правильно обрабатывал данные

при включенном чекбоксе (user_ip) as ip

Спасибо за помощь, блин весь мозг себе схавал )))).

Теперь все супер.

К стати на хабре вообще нет алиаса, и там отдается не обработанное значение ячейки

Если в таблице ip значение получить так INET_NTOA(user_ip) то получится не обработанное значение IP адреса 2130706433

А если сделать алиас INET_NTOA(user_ip) as `ip` FROM то в место 2130706433 получим IP адрес.

Главное кавычки `ip`. Иначе если так INET_NTOA(user_ip) as ip то получим 0.0.0.0

---------- Добавлено 04.01.2013 в 18:03 ----------

izbushka:
А у вас в базе IP в каком виде: число или текст? Судя по этому

в числовом.
А зачем? Я бы в тексте и хранил.. Тогда INET_NTOA(user_ip) просто поменять на user_ip в SQL

inet_aton(ip_adress) - конвертирует IP адрес в численное представление.

Нет именно в числовом, для этого и используется преобразование IP в 2130706433

127.0.0.1 INET_ATON('" ]. = 2130706433

2130706433 после обработки INET_NTOA(user_ip) = 127.0.0.1

Конечно можно тупо выкинуть функцию INET_ATON

Но раз уж она стоит то лучше разобраться и найти косяк.. Что я и сделал.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий