[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: автоавторизация из куки
altairo2087
Такой вопрос возник. Сделал авторизацию, ставлю куки. А как бы покрасивее из них авторизоваться при входе. У меня авторизация на отдельном файле и срабатывает через форму. Не могу придумать как бы получше сделать авторизацию из куки при входе на сайт, чтобы постоянно этот файл с авторизацией не инклудить и проверками не дергать.

Код файлов авторизации вот такой.

<?php
require_once("conf/login_conf.php");

if (isset($_GET['destroy'])) {
$destr = clearData($_GET['destroy'],"int");
if ($destr === 1) {
session_destroy();
setcookie("u","");
setcookie("p","");
} else {
header("Location:".$_SERVER['HTTP_REFERER']);
}
}


if (isset($_POST['submit'])) {
if (isset($_POST['login'])) {
$login = clearData($_POST['login'],"string");
$pass = md5(clearData($_POST['pass'],"string"));
$sql = "SELECT user_email,user_pass FROM user WHERE user_email='$login'";
$res = mysql_query($sql,$dblink_us) or die(mysql_error());
while ($row = mysql_fetch_assoc($res)){
if ($pass == $row['user_pass']) {
$_SESSION['user'] = $row['user_email'];
if (isset($_POST['remember'])) {
setcookie("u",$login,time()+3600,"",$_SERVER['HTTP_HOST'], False, True);
setcookie("p",$pass,time()+3600,"",$_SERVER['HTTP_HOST'], False, True);
}
header("Location:".$_SERVER['HTTP_REFERER']);
}
}

$_SESSION['warning'] = "логин или пароль неверен";
header("Location:".$_SERVER['HTTP_REFERER']);
}
}
else {
header("Location: index.php");
}
mysql_close($dblink_us);


файл с базой

<?php
//определяем константы для подключения к бд
define("HOST_USERS","localhost");
define("USER_USERS","general");
define("PASS_USERS","54321");
define("DB_USERS","users");
//подключение к СУБД
$dblink_us = mysql_connect(HOST_USERS,USER_USERS,PASS_USERS) or die (mysql_error());
//выбираем БД
mysql_select_db(DB_USERS,$dblink_us);
//установка кодировки UTF8
mysql_query("SET NAMES utf8",$dblink_us);
mysql_query("set character_set_client='utf8'",$dblink_us);
mysql_query("set character_set_results='utf8",$dblink_us);
mysql_query("set collation_connection='utf8_general_ci'",$dblink_us);

//сессия
session_start();

//функция "очистки" данных
function clearData ($data, $type="string")
{
switch ($type)
{
case "string" :
return mysql_real_escape_string(trim(strip_tags($data)));
case "int" :
return abs((int)$data);
}
}



и если можно критику, это моя первая авторизация, на сайте работает отлично.



Спустя 7 минут, 14 секунд (17.09.2012 - 12:11) Игорь_Vasinsky написал(а):
Цитата
$pass = md5(clearData($_POST['pass'],"string"));

что это за фанатизм?

обычного хеша достаточно


Цитата
while ($row = mysql_fetch_assoc($res)){
            if ($pass == $row['user_pass']) {
                $_SESSION['user'] = $row['user_email'];


да ну.. всех 100500 пользователей проверять так будешь?

прочитай про mysql_num_rows(), а запросом ищешь совпадение пары логина и пароля в одной строке

Цитата
or die (mysql_error());

при отладке юзай, при продакшене - не стоит выводить служебную инфу посетителям.


Цитата
mysql_query("SET NAMES utf8",$dblink_us);
mysql_query("set character_set_client='utf8'",$dblink_us);
mysql_query("set character_set_results='utf8",$dblink_us);
mysql_query("set collation_connection='utf8_general_ci'",$dblink_us);


Лично мне всегда достаточно
mysql_query("SET NAMES utf8",$dblink_us);


Цитата
return abs((int)$data);

да ну нафиг...

чем тебя так не устроило?
(int)$data

Спустя 1 минута, 24 секунды (17.09.2012 - 12:12) Игорь_Vasinsky написал(а):
Цитата
//сессия
session_start();

чё она в середине делает?

любой незначительный нотис - и нету у тя сессии.

Спустя 3 минуты, 3 секунды (17.09.2012 - 12:15) Игорь_Vasinsky написал(а):
потом...

при авторизации ты не где не ищешь уже имеющиеся куки $_COOKIE.. а зачем вообще создавать?

Спустя 24 минуты, 14 секунд (17.09.2012 - 12:40) altairo2087 написал(а):
Поправил, спасибо.
Насчет кук. У меня этот файл логина вызывается из формы по кнопке, обрабатывает и возвращает. То есть как я понимаю он подключается только по нажатию кнопки, обрабатывает и возвращает. То есть проверка мне нужна в "основных" файлах сайта. То есть там на основном файле я проверяю наличие кук и если куки верны, то авторизация. Вот и думаю как в основном файле чекнуть куки без постоянного инклуда файла и базы логинов. Или я чет неправильно понимаю?

Спустя 3 минуты, 55 секунд (17.09.2012 - 12:43) Игорь_Vasinsky написал(а):
в чём смысл использования кук для "запомнить меня"?

1. юзеру обеспечивается автоматическая авторизация
2. со стороны сайта исключается дополнительная сверка авторизационных данных - т.к. присутствуют определённые куки.

Спустя 15 минут, 51 секунда (17.09.2012 - 12:59) altairo2087 написал(а):
Мммм...
Но мне же надо проверить ее по базе пользователей? Если я просто проверю на наличие куки, то можно получается любую куку подставить. Просто я там планирую еще привилегии редактора. То есть редактор оставил куку и при следующем входе мне надо как-то автоматически подтвердить, что редактор зашел и вывести какие-то инструменты. Весь сайт у меня допустим в index.php, там форма, которая пуляет в login.php - та говорит в обратку: "да такой-то пользователь, такие-то привилегии". А вот человек с кукой зашел в index.php, а без отправки данных в форму и проверки-то нет на права, есть только куки. Не могу ж права просто в куки сохранять.

Спустя 1 час, 2 минуты, 41 секунда (17.09.2012 - 14:02) Игорь_Vasinsky написал(а):
это если ты подстраховаться хочешь

а так - по сути ты и создаёшь куку - чтобы узнавать юзера, в ней и хранишь - всё что нужно

Спустя 40 минут, 24 секунды (17.09.2012 - 14:42) altairo2087 написал(а):
Все сделал. В index.php

if (isset($_COOKIE['u'])) {
if (!isset($_SESSION['user'])) {
header("Location: login.php");
}
}


типа если есть кука юзера, но нету юзера в сессии, чекни кук юзера по базе в логине:

if (isset($_COOKIE['u'])) {
$u = clearData($_COOKIE['u'],"string");
$p = clearData($_COOKIE['p'],"string");
$sqlc = "SELECT user_email,user_pass FROM user WHERE user_email='$u'";
$resc = mysql_query($sqlc,$dblink_us);
$rowc = mysql_num_rows($resc);
if ($rowc>0) {
$c = mysql_fetch_assoc($resc);
if ($p == $c['user_pass']) {
$_SESSION['user'] = $c['user_email'];
}
} else {
setcookie("u","");
setcookie("p","");
}
header("Location: index.php");
}


А тут чекаем юзера из куки, если норм то авторизуем, если нет то стираем кривую куку.

Одно только не поперло. Приходится при входе на сайт переправлять юзера на главную. Потому проверка идут пока страница не загрузилась, оттого header("Location:".$_SERVER['HTTP_REFERER']) выкидывает вообще из сайта. А если юзер заходил на сайт по ссылке в блог на определенную статью, то его проверка выкинет на главную... -_-

Спустя 5 минут, 13 секунд (17.09.2012 - 14:48) Игорь_Vasinsky написал(а):
Цитата
if ($rowc>0)

достаточно
if ($rowc)

тыж в случае 0 - false получишь

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.