Автор Тема: Авторизация  (Прочитано 18163 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Авторизация
« Ответ #15 : 13 Марта 2004, 00:49:49 »
Цитировать
@ Нужна для подавления ошибок

Восхитительный пассаж.
Сообщения об ошибках - ЕДИНСТВЕННЫЙ способ для программиста узнать, что он написал кривую программу.
Однако вместо того, чтобы переписать ее, мы просто заткнем ей рот.
прелестно.
Сами же растим грабли. на которые потом со всей дури...

Оффлайн Rodent

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 133
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.unimix.ru
Авторизация
« Ответ #16 : 13 Марта 2004, 01:08:01 »
Огромное спасибо Neter
Опробывал... работает... даже разобрался...

Но теперь возникло еще пара вопросов.
Я тут на форуме выяснял, какая структура сайта более рациональна с точки зрения легкой смены дизайна и кода.
Ну так вот я пришел вот к такой схеме.
У меня есть файлы
index.php - это начальный файл к нему подключаются:
function.php - где собраны все функции, которые довольно-таки часто используются на сайте
design.php - сам дизайн сайта.

index.php
require ("function.php");
$page=$_GET["page"];
$pages["main"]=array("file"=>"main.php","menu"=>"menu01.php");
$pages["news"]=array("file"=>"news.php","menu"=>"menu02.php");
$pages["guest"]=array("file"=>"guest.php","menu"=>"menu03.php");
$pages["admin"]=array("file"=>"admin.php","menu"=>"menu04.php");

$menu=$pages[$page]["menu"];
$main=$pages[$page]["file"];

require ("design.php");
?>

Файл design.php как видно состоит из шапки неизменной, и таблицы разделенной на две части: меню и основная часть.

Теперь вопрос как мне сделать авторизацию на страницы вставляемые таким путем, так как естественно пхп ругается, потому что сессии должны запускаться до отправления чего-либо в браузер?
И еще при такой авторизации если у нас не задана сессионная переменная user, то задействуется функция exit, которая убивает все, но дизайн-то требует законченности.

Вот такие теперь у меня возникают вопросы.

Оффлайн Rodent

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 133
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.unimix.ru
Авторизация
« Ответ #17 : 13 Марта 2004, 01:10:01 »
RomikChef
а что ты предлагаешь???

Оффлайн Neter

  • Жустер
  • Старожил
  • ****
  • Сообщений: 324
  • +0/-0
  • 2
    • Просмотр профиля
Авторизация
« Ответ #18 : 13 Марта 2004, 10:25:47 »
RomikChef Рома, я знаю о твоём мнении насчёт этих собак, я это понимаю, но это тот случай когда подавление сообщения об ошибке оправдано. Насчёт @$users[$userName] - это мне и самому не нравится, просто не подумавши написал, впринципе это правильно и ничего страшного в этом нет, но на всякий случай я поправил код. Или ты где-то ошибку увидел? (вопрос с подковыркой ;) )

Rodent Дам тебе совет насчёт собак, никогда не используй их для функций и собственных переменных, НИКОГДА!
Мне тормоз послужил толчком...

Оффлайн Diesel

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 69
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Авторизация
« Ответ #19 : 13 Марта 2004, 12:05:45 »
Neter
НЕТ собакам(@)! ДА отключению вывода ошибок в php.ini
НЕТ двойным кавычкам! ДА одинарным![не актуально]
НЕТ конструкциям типа $var==""! ДА функциям [p]isset[/p] и [p]empty[/p]
« Последнее редактирование: 13 Марта 2004, 12:55:49 от RomikChef »

Оффлайн Diesel

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 69
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Авторизация
« Ответ #20 : 13 Марта 2004, 12:10:28 »
Rodent создавай новые топики для новых вопросов

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Авторизация
« Ответ #21 : 13 Марта 2004, 13:26:16 »
Цитировать
Neter:
я знаю о твоём мнении насчёт этих собак

Ничего ты не знаешь!
Ни-Че-Го!
Ты сам-то почитай свои оправдания!
Вчера я был слишком уставший, чтобы заниматься разжевыванием азов.
Делаю это сейчас.
Вот смотри, я тебя, неуча, сейчас буду тыкать носом.
Наглядно показывать, что имея наглость с малыми знаниями иметь свое собственное мнение, ты сам расставляешь себе грабли.
Цитировать
@ Нужна для подавления ошибок . т.е. если человек не жмакнул кнопку

Твои слова?
А тебе известно о том, что переменная эта может быть не установлена, при том, что форма отправлена? Если просто нажать на ентер. Вот если бы у тебя не было собаки - ты бы этот момент увидел СРАЗУ! По нотайсу. Пришел бы на форум - а как это так - форма отправлена, а переменной нету. И тебе бы объяснили.
А собакой ты нотайс подавил. В переменных своих ты уверен. И ловил бы глюк хрен знает сколько времени.
воспитательная часть закончена. Переходим к практической.

Если надо проверить, есть такая переменная, или нет, то надо использовать функцию isset() и нотайсов не будет, и ясность во всем. Не выполняется условие? Значит, переменная не установлена. Копаем, почему. НО НЕ ЗАТЫКАЕМ ПРОГРАММЕ РОТ!
И не пишем программ, в которых ошибки являются их частью.
Хотя, по-моему, некоторые люди просто не в состоянии понять, что сообщения об ошибках сделаны ДЛЯ ПОМОЩИ, а не просто развлечение разработчиков, чтобы досадить несчастным программистам и их надо подавлять.

Если надо проверить, отправлена была форма, или нет, при условии, что форма одна на странице (что бывает в подавляющем большинстве случаев), достаточно проверить _SERVER[\'REQUEST_METHOD\']. Если форм много и все с одним экшеном, то нужно хидден поле, чтобы их отличить.

с $_POST["logon"] (вместо которого ты мне подсунул @$users) разобрались.
Далее.
@$_POST["user"]
Как мы уже проверили выше, фолрма пришла постом.
Значит, поля "юзер" и "пасс" в ней обязательно должны быть.
А вдруг их нету???
А если их нету, то это форс-мажорная ситуация! Это или хакер лезет, или ошибка какая-то. Так программисту НАОБОРОТ!!!! НАДО. ОБ. ЭТОМ. ЗНАТЬ!!!
Что форма передана. а переменные почему-то - нет.
Ну я совершенно не представляю, как можно быть настолько страусом.
Ты для заказчика что ли пишешь? Лишь бы скинуть? Ну так отключи сообщения об ошибках ВООБЩЕ ВСЕ. И дело с концом.
А если ты нормальный программист, если тебя волнует работоспособность программы, то ты должен
1. написать ее так, чтобы она в штатном режиме никаких ошибок не выдавала. Чтобы ошибки не были ее частью.
2. ТЩАТЕЛЬНО изучать все сообщения об ошибках, буде таковые появятся. Иисправлять.
ПРИЧИНУ исправлять, бестолочь! а не сообщение. Болезнь лечить, а не симптом!
3. Скрывать сообщения об ошибках от юзера - они ему не нужны.
display_errors=off
ПОКАЗЫВАТЬ сообщения программисту
log_errors=on

Дальше.
Этот твой  @$users
Вижу - исправил.
Опять же - за что ты не любишь примитивную функцию isset?
она гораздо короче, чем твой аррай кей екзистс и удобнее.
Тебе кажется, что обе эти функции все равно лишние?
Ну так учти, что в массиве никто логины с паролями не хранит, и весь этот пример притянут за уши.
то есть, проверять существование ключа одновременно со сравнением значения  требуется на самом деле достаточно редко.
В нормальном же применении массивов попытка обратиться к несуществующему индексу - ОШИБКА! Важная ошибка, о которой должен знать программист.
О которой он будет знать, если не затыкает своей программе рот.

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Авторизация
« Ответ #22 : 13 Марта 2004, 13:37:36 »
Rodent
Я тебе отвечу.
Однако предупреждаю - если начнутся стоны или обидки, то тема будет немедленно закрыта.
Я не обсуждаю здесь вопросы твоей гениальности ли убогости. Такое мнение может возникнуть ТОЛКО если
1. ты считаешь себя гением, а свое решение гениальным
2. твое рещение критикуется.
При адекватной же самооценке факт критики воспринимается не как попытка наехать, а как попытка помочь.

Сейчас ты наткнулся на первые грабли системы "запихнуть весь сайт в один файл". Оставив в стороне эстетическую сторону вопроса, я лишь скажу, что граблей таких будет много.
К примеру:
Вот на этом сайте выводится в заголовке окна (в теге title) название темы. А в твоем это сделать затруднительно.

Заплаток можно будет наставить много. Из-за них твой файл индекс, который не делает НИЧЕГО кроме того, что показывает другие файлы юзеру, будет ВСЕ ВРЕМЯ разрастаться.
Я считаю, что лучше обойтись без него вовсе. Без лишнего кода, без лишнего файла, без лишнего параметра в адресе.

Возьми, да раздели свой design.php на две части - верх и низ.
И подключай в каждом скрипте в нужных местах.
Таким образом разом снимутся все проблемы. Сохранится легкость смены дизайна. И скрипты приобретут гибкость.

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Авторизация
« Ответ #23 : 13 Марта 2004, 13:46:47 »
Цитировать
$userName = trim(@$_POST["user"]);
$userPass = trim(@$_POST["pass"]);
if ($userName=="") { $error[]="Не заполнено поле \\"Имя\\""; }
if ($userPass=="") { $error[]="Не заполнено поле \\"Пароль\\""; }

заменяем на

if (!$userName=trim($_POST["user"])) $error[]=\'Не заполнено поле "Имя"\'; 
if (!$userPass=trim($_POST["pass"])) $error[]=\'Не заполнено поле "Пароль"\'; 

получается гораздо читабельнее и элегантнее.

Далее.
session_start(); имеет смысл делать только в случае удачной авторизации. Какой смысл стартовать сессию хакеру, к примеру, подбирающему проль?
Цитировать

$_SESSION[\'username\'] = "";
$_SESSION[\'userpass\'] = "";

это лишнее.
Цитировать
$_SESSION[\'userpass\'] = $userPass;

А это - тем более!

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Авторизация
« Ответ #24 : 13 Марта 2004, 13:50:40 »
самое обидное, что учишь вас, учишь.
пишнешь километры текста. и в фак.
и каждому персонально.
А толку - ноль.
Или "я знаю твое мнение, но сделаю по-своему" или вообще "чего со своими замечаниями лезешь".

Тут еще один кадр был.
Задает идиотский вопрос, типа, "как получить 2х2=5" и в ответ на замечание выдающий сакраментальное "не знаешь, как сделать - молчи лучше!".

Эх. Прав Ксандер. Вырождаются форумы...

Оффлайн Rodent

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 133
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.unimix.ru
Авторизация
« Ответ #25 : 13 Марта 2004, 14:53:08 »
RomikChef
Ты уж извини, был не прав.
Я не буду оправдываться, но скажу, что так как я новичек в этом деле, то естественно у меня возникают вопросы и проблемы. Если возникла проблема, то я сам пытаюсь сначала ее решить, благо инфо в инете полно. Но если я промаялся 2-3 дня и ничего, тогда я прихожу сюды и спрашиваю идиотские вопросы. Ну а так как ты являешься активным участником данного форума, то ты мне почти постоянно и отвечаешь. Оперативно, конечно, но обычно твои ответы сводились вот к этому:
Цитировать
Восхитительный пассаж.
Сообщения об ошибках - ЕДИНСТВЕННЫЙ способ для программиста узнать, что он написал кривую программу.
Однако вместо того, чтобы переписать ее, мы просто заткнем ей рот.
прелестно.
Сами же растим грабли. на которые потом со всей дури...

Цитировать
видимо, нет спеца по этой проблеме.
Лично у меня апач никогда не зависал.
если имеется в виду спец по поиску на bugs.php.net то не вижу причины, по которой я это должен делать вместо тебя.

Цитировать
Главное, что ты должен понять из этих "шуток" - что ты сильно ошибся форумом.

Да, признаю, был глуп и наивен, но все меняется и не стоит на месте...

Оффлайн Rodent

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 133
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.unimix.ru
Авторизация
« Ответ #26 : 13 Марта 2004, 15:01:30 »
А теперь вернемся к моим баранам, если вы не против...
Вот такой код у меня получился после всех изменений.

auth.php

<? 
$users["demo"]=md5("demo"); 

$error = array(); // Типа так надо :) 

if (isset($_POST["logon"])){ 
	
if (!
$userName=trim($_POST["user"])) $error[]=\'Не заполнено поле "Имя"\'; 
	
if (!$userPass=trim($_POST["pass"])) $error[]=\'Не заполнено поле "Пароль"\';
    if (isset($username, $users) && $users[$userName]!=md5($userPass)) { $error[]="Неверный пароль"; } 
    if (!count($error)) {
	
	
session_start();
	
	
$_SESSION[\'username\'] = $userName; // С переменными сесси гораздо удобней работать как с суперглобальным массивом. 
	
}
}

if (count($error)){ // Если $error не пуст покажем его содержимое. 
	
echo "Ошибка"; 
	
foreach ($error as $value) { echo "<li>$value</li>"; } 


if (!$_SESSION[\'username\']){ 
?> 
<form action="<?=$_SERVER[\'PHP_SELF\'];?>" method="post"> 

Username: <input name="user" type="Text" size="10"> 

Password: <input name="pass" type="Password" size="10"> 

<input name="logon" type="submit" value="Войти"> 
</form> 
<? 
exit; // Вывести форму и закончить выполнение скрипта. 

?> 


test.php

<? 
require(
"auth.php"); 
?> 
А вот тут уже что угодно :) 


Теперь еще вопросы. мы использовали функцию exit; это означает конец выполнения скрипта и выдачи страницы пользователю. Что тогда происходит с дизайном сайта, если пропадают все закрывающие теги?

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Авторизация
« Ответ #27 : 13 Марта 2004, 15:36:03 »
я написал, как сделать, чтобы проблемы такой не было :-)

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Авторизация
« Ответ #28 : 14 Марта 2004, 11:43:45 »
Neter
воздержись от написания сообщений в этот форум.

Оффлайн Neter

  • Жустер
  • Старожил
  • ****
  • Сообщений: 324
  • +0/-0
  • 2
    • Просмотр профиля
Авторизация
« Ответ #29 : 14 Марта 2004, 13:06:14 »
RomikChef Извини, не знал, что твой идиотизм хронический.
Мне тормоз послужил толчком...

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28