Помощник
|
Кнопка "Запомнить пароль" |
Валериан
|
Сообщение
#1
|
||
|
|
||
|
|||
Letmetouchyou |
10.8.2010, 14:04;
Ответить: Letmetouchyou
Сообщение
#2
|
|
Валериан, куки
|
|
|
SOKOJI |
10.8.2010, 14:04;
Ответить: SOKOJI
Сообщение
#3
|
|
|
|
|
Валериан
|
Сообщение
#4
|
|
А если у меня только сессии - пойдет?
|
|
|
Flok |
10.8.2010, 18:18;
Ответить: Flok
Сообщение
#5
|
|
мой пример авторизации по кукам и сессиям (только на сессии нельзя создать, ибо сессия убьётся после закрытия браузера):
[php]if ((isset($_POST['login']) OR isset($_COOKIE['login'])) AND !isset($_SESSION['id'])) { # пояснение: # если пользователь отправляет данные через форму # или данные хранятся в куках, при этом пользователь не # авторизирован на сайте, то делаю выборку из базы: #присваиваем переменным значения из куков if (isset($_COOKIE['login'])) {$aut_login=$_COOKIE['login'];} if (isset($_COOKIE['password'])) {$aut_password=$_COOKIE['password'];}//в куках хранится хэш пароля # ну или из формы. # я сделал такой порядок, что бы при наличии данных из формы # куки ни на что не влияли, и их можно было обновить в дальнейшем if (isset($_POST['login'])) {$aut_login=$_POST['login'];} if (isset($_POST['password'])) {$aut_password=md5(md5($_POST['password']));} //из формы пришёл обычных пароль. шифруем $db = mysql_connect ("localhost","мой_логин","мой_пароль") or die(); mysql_select_db ("моя бд",$db) or die(); $query = mysql_query('SELECT * FROM users WHERE login=\''.$aut_login.'\' AND password = \''.$aut_password.'\'') or die(); $a = mysql_fetch_array($query); if (isset($a[0])) { # если вернулась хоть одна строка с пользователем ... $_SESSION['id'] = $a['id']; $_SESSION['login'] = $a['login']; #вбиваем его данные в сессии setcookie('login', $a['login'], time()+15*24*60*60); setcookie('password', $aut_password, time()+15*24*60*60); # и обновляем куки. } else { echo 'неправильный логин или пароль'; } }[/php]замечу, что у моего хостера стоит своя защита от инъекций, поэтому проверку данных из форм я не провожу. заодно прошу профессионалов оценить мой алгоритм и может быть что-нибудь посоветовать ) |
|
|
Letmetouchyou |
10.8.2010, 18:35;
Ответить: Letmetouchyou
Сообщение
#6
|
|
Каждый блок, программа, модуль должны делать только одну вещь и делать ее хорошо. Если цель, назначение блока начинает «размазываться», стоит задумываться о ее разделении на части.
равила модульности. Оно звучит так: «Простые блоки связывайте друг с другом ясными и понятными интерфейсами» (Rule of Modularity: Write simple parts connected by clean interfaces). Другими словами, нужно еще на этапе проектирования стараться разбить целевую систему на набор простых блоков и постараться не изобретать велосипед в части взаимодействия между ними, придерживаться в этом единообразия. Очень важно, что каждый блок должен делать только одну вещь и делать ее хорошо. Два примера из реальной жизни: 1) классический домашний ПК из системного блока и монитора 2) ноутбук. К примеру, на обоих погас экран. Причина может быть в чем угодно, как мы понимаем. Но в случае домашнего ПК легко проверить первое предположение: а работает ли монитор на другом компьютере? если не работает — причина в мониторе. Если да — причина в компьютере. Далее можно попробовать видеокарту на другом компьютере — и сразу понять, в ней дело или нет. Аналогично дело обстоит с клавиатурой, мышью… я это к тому, что лутше, удобнее, униварсальнее все таки использовать ООП или уже набор обычных функций) ***$db*=*mysql_connect*("localhost","мой_логин","мой_пароль")*or*die();*****mysql_select_db*("моя*бд",$db)*or*die(); а для коннекта и дисконнекта использовать класс, со статическимим методами =) **$query*=*mysql_query('SELECT***FROM*users*WHERE*login=\''.$aut_login.'\'*AND*password*=*\''.$aut_password.'\'') тут можно в конце добавть LIMIT 1; *$a*=*mysql_fetch_array($query);****if*(isset($a[0]))*{* тут, если например нету пользоватлей, то вернет еррор, точнее выполненеи скрипта будет прекрашено, если не установлен error_reporting; праильнее делать так (образо): result = mysql_query(); if(result and mysql_num_rows()==1) количество строк выборки должно быть строго равно 1. __ 2 раза md5 - безтолку ) |
|
|
SOKOJI |
10.8.2010, 18:53;
Ответить: SOKOJI
Сообщение
#7
|
|
http://pyha.ru/articles/php/auth/ - радуйтесь, детишечки :D
PS. Я вместо двойного мд5 соль юзаю :) Там же в статье расписано что это и с чем едят. |
|
|
Letmetouchyou |
10.8.2010, 19:13;
Ответить: Letmetouchyou
Сообщение
#8
|
|
SOKOJI, читал ето год назад гдето ))
|
|
|
Flok |
10.8.2010, 19:31;
Ответить: Flok
Сообщение
#9
|
|
а для коннекта и дисконнекта использовать класс, со статическимим методами =) если б я ещё знал, что это такое, было бы вообще прекрасно ) сейчас я знаю только о функциональной составляющей php, ибо учился по курсам Попова (его двизию :censored:) сейчас взял нормальную книжку, буду переучиваться ) Letmetouchyou,за подсказки спасибо ) |
|
|
Mulder_hb |
10.8.2010, 21:30;
Ответить: Mulder_hb
Сообщение
#10
|
|
А если у меня только сессии - пойдет? Сессия - это особая кука. Так что если у вас есть сессия, то и кука будет работать. [PHP]if ((isset($_POST['login']) OR isset($_COOKIE['login'])) AND !isset($_SESSION['id'])) {[/PHP] Так не проверяют. Проверяют только элементы массива $_COOKIE. Если данные есть идет проверка и расшифровка данных из кук. Если они верны, то авторизация. Если элементов массива кук нет, то появляется страница входа и потом снимаются данные из массива $_REQUEST. [PHP]$aut_login=$_POST['login']; $aut_password=md5(md5($_POST['password'])); [/PHP] Никогда не передавайте в куку данные так, как они подставляются в бд. Сначала хешируйте данные по ключу, потом, желательно, серилизуйте и уже потом отправляйте пользователю. Когда снимаете данные из кук, проводите обратные операции - десириализация и расшифровка. [PHP]$query = mysql_query('SELECT * FROM users WHERE login=\''.$aut_login.'\' AND password = \''.$aut_password.'\'') or die();[/PHP] Так выглядит понятнее: [PHP]$query = mysql_query("SELECT `id` FROM `users` WHERE `login` = '".$aut_login."' AND `password` = '".$aut_password."'") or die();[/PHP] Никогда не ставьте звездочку, если не собираетесь использовать все поля в скрипте. [PHP]if (isset($a[0])) {[/PHP] Так не проверяют. Достаточно проверить всю переменную: [PHP]if ($a) {[/PHP] [PHP]setcookie('login', $a['login'], time()+15*24*60*60); setcookie('password', $aut_password, time()+15*24*60*60);[/PHP] Период установки кук проще и удобней считать отдельно заранее. я это к тому, что лутше, удобнее, униварсальнее все таки использовать ООП или уже набор обычных функций) Исправить ошибки и будет отдельный модуль. Ничего в приведенном скрипте лишнего нет. Если развивать функциональность дальше, то да желательно ООП. а для коннекта и дисконнекта использовать класс, со статическимим методами =) Зачем? Аргументируйте зачем в данной ситуации использовать класс да и еще со статическими методами? Разве только это большой будущий сайт. И то с большой натяжкой. Все решает разработчик. тут можно в конце добавть LIMIT 1; А что на сайте могут существовать более одного пользователя с уникальным именем :sarcastic: ? тут, если например нету пользоватлей, то вернет еррор, точнее выполненеи скрипта будет прекрашено, если не установлен error_reporting; В корне не верно. Если пользователя нет, то if($a) будет эквивалентен if(false) и скрипт пойдет по другой ветке. |
|
|
|
Похожие темы
Тема | Ответов | Автор | Просмотров | Последний ответ | |
---|---|---|---|---|---|
Требуется помощь по сайту на "ВордПресс" Закрылся доступ в панель администратора |
12 | Tia2 | 1527 | 25.3.2024, 6:54 автор: Skyworker |
|
✅ sms.chekons.com - ⭐ Сервис для получения SMS на реальные номера USA "Non-VoIP, безлим SMS, API" ⭐ Сервис для получения SMS на реальные номера USA |
10 | Chekon | 3582 | 24.3.2024, 14:15 автор: Chekon |
|
⭐⭐⭐ Google Voice | Gmail - OLD аккаунты "SMS и звонки" ⭐⭐⭐ | 12 | Chekon | 3817 | 24.3.2024, 13:56 автор: Chekon |
|
Опрос: Результаты в упражнении "Жим лёжа" у вэбмастеров | 35 | Room | 4464 | 13.3.2024, 13:10 автор: Room |
|
"Лежащий" домен - 10 лет. Продать? | 8 | Wolfhound | 2382 | 5.3.2024, 3:22 автор: Liudmila |
Текстовая версия | Сейчас: 29.3.2024, 1:16 |