Просмотр полной версии : Php Авторизация
procedure
14.01.2008, 11:17
Такой вопрос. Обьясните пожалуста + и -. Что лучше применять значения глобальных переменных или сохранять значения авторизации в массиве.
Вобщем расскажите по подробней.
.:EnoT:.
14.01.2008, 11:28
Ничё не понял...
при чём тут массивы?
глобальные переменные - это зло,на большинстве серверов register_globals отключена.лучше хранить всё в сессии и обращаться как:
echo "Имя:".$_SESSION['user'];
procedure
14.01.2008, 11:34
Ничё не понял...
при чём тут массивы?
Да я читал что можно просто данные авторизацции хранить в массиве, каком то.
echo "Имя:".$_SESSION['user'];
понятно спасибо. а почему отключена? я уже на локалхосте планирую блог.
.:EnoT:.
14.01.2008, 11:37
на php6 разработчики вообще хотят по дефолту выключить регистер_глобалс и правильно!
если автор имеет ввиду про то как лучше проводить авторизацию...то лучше использовать связку сессий и куки.
scrat +1 регистр глобалс зло
А как связаны авторизация и register_globals???
на php6 разработчики вообще хотят по дефолту выключить регистер_глобалс и правильно!
если автор имеет ввиду про то как лучше проводить авторизацию...то лучше использовать связку сессий и куки.
scrat +1 регистр глобалс зло
они её не отключат.её просто не будет
procedure
14.01.2008, 11:42
все равно не понимаю, у меня в учебнике описание глобальных переменных чуть ли не на весь учебник...
.:EnoT:.
14.01.2008, 11:44
при registr_globals on данные записываются прям в переменные, т.е.
#какая-то форма, например авторизации
echo'
<form method="post">
<input type="text" name="name" />
.....
</form>';
echo"$name";
Т.е. name как видишь записывается прямо в переменную.
А при офф нужно делать так:
$name = $_POST['name'];
т.е. получать данные из запроса и уже после этого писать их в переменную.
А данные об авторизации храни в куки.
При использовании сессий авторизация хранится грубо говоря только до закрытия окна браузера. Потом придётся заново вводить логин/пароль.
При использовании куки такого нет, куки хранятся до истечения срока их действия (скока установишь).
Минус в том что бывает что куки отключены в браузере, хотя это бывает редко.
Забудьте про глобальные переменные и отключите у себя register_globals, если это у вас включено. Юзайте сессии, как уже было сказано. Кстати, $_SESSION - это и есть массив.
procedure
14.01.2008, 11:49
При использовании сессий авторизация хранится грубо говоря только до закрытия окна браузера. Потом придётся заново вводить логин/пароль.
При использовании куки такого нет, куки хранятся до истечения срока их действия (скока установишь).
Минус в том что бывает что куки отключены в браузере, хотя это бывает редко.
прям на пальцах обьяснил. Спасибо всем, а именно scrat и .:EnoT:. ++.
Думаю ну их на. эти кукисы оставлю все в сесси пусть юзеры авторизируются уждый раз зато безопасность больше.
.:EnoT:.
14.01.2008, 12:07
прям на пальцах обьяснил. Спасибо всем, а именно scrat и .:EnoT:. ++.
Думаю ну их на. эти кукисы оставлю все в сесси пусть юзеры авторизируются уждый раз зато безопасность больше.
ну не скажи. при правильном использовании куки не только безопасны но и очень удобны.
Если сомневаешься в безопасности скриптов. Т.е. боишься что могут спереть куки, то сдлеай хотя бы банальную привязку к ip. вписывай в куки айпи (можно и захешировать чтоб прикольней было), внеси этот ип в базу данных, а потом проверяй. если всё совпадает то пускай юзера, если нет, то посылай его))
прям на пальцах обьяснил. Спасибо всем, а именно scrat и .:EnoT:. ++.
Думаю ну их на. эти кукисы оставлю все в сесси пусть юзеры авторизируются уждый раз зато безопасность больше.
А как ты будешь знать, какой юзер кто? Сессии ведь тоже надо определять чьи :) Все равно придется куки делать, либо заносить в сессию какие-то особенности юзера, типа ip и браузера.
Да я читал что можно просто данные авторизацции хранить в массиве, каком то.
Вот что ты имеешь ввиду:
<?php
if(empty($_SERVER['PHP_AUTH_USER']))
{
Header("WWW-Authenticate: Basic realm=\"Admin Page\"");
Header("HTTP/1.0 401 Unauthorized");
}
else
{
echo "Пользователь: ".$_SERVER['PHP_AUTH_USER'];
echo "Пароль: ".$_SERVER['PHP_AUTH_PW'];
}
?>
.:EnoT:.
14.01.2008, 13:34
SSB1981
оффтоп
имхо, в твоём скрипте лучше использовать не empty() а isset() , проверку на существование а не на пустоту :)
procedure
17.01.2008, 04:47
if(empty($_SERVER['PHP_AUTH_USER']))
{
Header("WWW-Authenticate: Basic realm=\"Admin Page\"");
Header("HTTP/1.0 401 Unauthorized");
поясни пожалуйста?
До меня так и не дошло, где нуно хранить пароли? Создать скрипт на сервере и в нем хранить все пароли или будет удобнее хранить их в каком либо массиве?
Что то я эту систему не до конца понимаю, наверное из за того что я ещё к СУБД не приступил?
То, что привел SSB1981 это как метод авторизации, тоесть передачи значения имени пользователя и пароля... Дальше просто нужно обработать $_SERVER['PHP_AUTH_USER'] и $_SERVER['PHP_AUTH_PW']...
Или создать сессию... или кукисы... Конешно перед этим нужно их сверить с существующими именами пользователя и пароля... Можно использовать как SQL базу данных либо организовать хранение пар "username>Password" в файле...
С SQL всё ясно пробую сравнить пароль, где имя пользователя = $_SERVER['PHP_AUTH_USER']... Потом уже создаем кукисы и сессии...
- Если хранить на файле...
Например создаем файл db.txt
Пары храниться будут в виде user:password
например содержание нашего файла такое:
admin:TTwhgs2
user:qwerty
Сначала загружаем этот файл в один массив...
$db = file("db.txt");
Тут каждый элемент массива будет содержать одну строчку файла, тоесть размер массива в данном случае - 2...
Затем разбить каждую строку... Потому, как имя отделено от пароля символом ":"
Потом создать цикл и проверять входящие данные (имя пользователя и пароля) с каждым элмента массива...
Хз понял ли не понял =))))
--------------------------------------------------
Ну короче вот бональный пример:
Создал в блокноте (Windows, это важно) файл с паролями:
admin:pass
user:loleg
user1:loleg1
user2:loleg2
Потом сам скрипт:
<?php
$uname = $_GET['user'];
$pwd = $_GET['pw'];
$db = file("db.txt");
foreach($db as $str) {
if ($uname.":".$pwd."\r\n" == $str) { ECHO "Hello $uname"; }
}
?>
<form>
<input type="text" name="user">
<input type="text" name="pw">
</form>
Разберемся...
Я не стал тут разделять каждую строку массива на две перемнные, решил для просто стравнивать строки...
Вот цикл foreach назначает переменной $str с начала первую строку файла db.txt
Потом сравнивает
$uname.":".$pwd."\r\n" со этой строкой файла... И т.д. И если они будут совпадать выводим на экран "Hello $uname"
Почемуже именно такая строка?
Разберем её.
$uname - Это имя пользователя, если быть точном это $_POST['user'];
.":". - Это разделитель (Такой как и в файле)
$pwd - это пароль или $_GET['pw'];
."\r\n" - Это переход на новую строку (Windows!!!) Еслибы был юникс, то \n, но так как я создавал этот файл в блокноте и чтобы перейти на строчку ниже я нажимал Enter, а значит добавлял в конец строки \r\n
Конешно я мог импользовать rtrim но мне не хотелось =)
Короче надеюсь и тут понятно =)
Добалю... Там где Hello $uname можно стартовать сессию или кукисы а в начале файла проверять их наличие...
procedure
17.01.2008, 14:56
bul.666-> ну 70% понял, остается эксперементировать на локалхосте.
Эх 2 вещи меня только расстраивают.
1. нельзя делать все через переменные, точнее можно только нежелательно.
2. и различие комманд между линух и винус.
bul.666 тебе огромное спасибо. надеюсь я с этого извлеко большой урок.
2. и различие комманд между линух и винус.
Что касается командо, то да =))))))))
А если ты переживаешь изза пробельных символов \r\n и \n то... в моем случае можно было использовать rtrim($str) кот удаляет конечный пробельный сиивол...
procedure
26.01.2008, 11:32
rtrim($str)
а где именно испольщовать? можно по подробней?
Ну смотри...
Есть строка или целый массив, как в данном случае, где в каждом элементе массива присутсвует $uname.":".$pwd."\r\n"
Т.е. например:
$temp = "root:p4ssw0rd\r\n";
Чтобы ыло удобней работать и раздель отдельно root и p4ssw0rd нужно удалить пробельные символы в конце строки... Значит используем функцию rtrim();
$temp = rtrim($temp);
Отсюда строка будет $temp = "root:p4ssw0rd";
------------
Дальше можно использовать следующий код для проверки:
<?php
$temp = "root:p4ssw0rd\r\n";
$temp = rtrim($temp); //Попробуй убрать и сравнить :)
if (isset($_GET['p'])) {
list($user,$pass)=explode(":",$temp);
if ($_GET['p']==$pass) { echo "Пользователь: $user Пароль: $pass"; }else echo "Wrong!!!";
}
?>
Тут если ?p будет равен p4ssw0rd, то Выведеться echo... Если не правильно то Будет Wrong!!! =)
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot