Strict Standards: Resource ID#18 used as offset, casting to integer (18) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#23 used as offset, casting to integer (23) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#25 used as offset, casting to integer (25) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#26 used as offset, casting to integer (26) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401
ТвойWeb :: Как создать закрытый раздел на сайте(PHP+MySQL)? [3]
ТвойWeb ТвойWeb
Качественный Европейский хостинг
Форум для чайников
 Чат на форуме      Помощь      Поиск      Пользователи


 Страниц (4): « 1 2 [3] 4 »   

> Без описания
Furax
Отправлено: 16 Апреля, 2008 - 08:25:36
Post Id



Бледнотик


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007  
Откуда: Иркутск, Сибирь, СССР

Карма 32




Systemnik, как всегда, торопится. В конце всех веток, кроме той, где вход выполнен успешно, должен стоять exit. И ещё, этот скрипт заставит для доступа к каждой странице вводить пароль. Кроме того, если не заданы POST-переменные, скрипт будет сыпать варнингами, что тоже нехорошо.

Я бы сделал так:
CODE:
<?php

require('auth.php');

?>

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


Файл auth.php:
CODE:
<?php

function createPwd($Size) //Создание случайного пароля
{
$pwd='';
$symbols='abcdefghijklmnopqrstuvwxyz0123456789'; //Символы
$length=strlen($symbols);

while ($Size--) //$Size символов
$pwd.=$symbols{mt_rand(0, $length-1)};

return $pwd;
}


function showForm($Text = NULL)
{
if ($Text)
echo $Text;

?><form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
Логин: <input type="text" name="login"><br>
Пароль: <input type="password" name="pwd"><br>
<input type="submit" value="Войти">
</form><?php

die('');
}


require_once('config.php');
mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PWD);
mysql_select_db(MYSQL_DB);

mt_srand((double)microtime()*1000000);
$table = MYSQL_TABLE;
$ip = addSlashes(substr((isSet($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR']), 0, 255));
$browser = addSlashes(substr($_SERVER['HTTP_USER_AGENT'], 0, 255));

mysql_query("UPDATE `$table` SET `temp` = NULL WHERE ADDDATE(`date`, INTERVAL 10 MINUTE) < NOW()");


if (isSet($_POST['login']) && isSet($_POST['pwd']))
{
$result = mysql_query("SELECT `id` FROM `$table` WHERE `login` = '" . addSlashes($_POST['login']) . "' AND `pwd` = '" . md5($_POST['pwd']) . "' LIMIT 1");

if (mysql_num_rows($result) == 1)
{
$id = mysql_fetch_row($result);
$id = $id[0];

$temp = createPwd(32);

mysql_query("UPDATE `$table` SET `temp` = '$temp', `ip` = '$ip', `browser` = '$browser', `date` = NOW() WHERE `id` = $id LIMIT 1");
setCookie('id', $id);
setCookie('pwd', $temp);
}
else
showForm('Неправильное имя пользователя или пароль!');
}
elseif (isSet($_COOKIE['id']) && isSet($_COOKIE['pwd']))
{
$id = (int)$_COOKIE['id'];
$temp = addSlashes($_COOKIE['pwd']);

$result = mysql_query("SELECT `id` FROM `$table` WHERE `id` = $id AND `temp` = '$temp' AND `browser` = '$browser' AND `ip` = '$ip' LIMIT 1");
if (mysql_num_rows($result) == 1)
mysql_query("UPDATE `$table` SET `date` = NOW() WHERE `id` = $id");
else
showForm();
}
else
showForm();

?>
Файл config.php:
CODE:
<?php

define('MYSQL_HOST', 'localhost');
define('MYSQL_USER', 'test');
define('MYSQL_PWD', 'test');
define('MYSQL_DB', 'test');
define('MYSQL_TABLE', 'users');

?>
Дамп таблицы:
CODE:
CREATE TABLE `users` (
`id` int(11) NOT NULL auto_increment,
`login` tinytext NOT NULL,
`pwd` varchar(32) NOT NULL default '',
`temp` varchar(32) default NULL,
`ip` tinytext NOT NULL,
`browser` tinytext NOT NULL,
`date` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=2 ;
Проверил у себя, вроде бы работает.
 
 Top
Furax
Отправлено: 16 Апреля, 2008 - 08:29:07
Post Id



Бледнотик


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007  
Откуда: Иркутск, Сибирь, СССР

Карма 32




З. Ы. Обратите внимание: require, а не include! Если сделать инклюд, то при отсутствии скрипта авторизации содержимое файла будет показано.
 
 Top
Systemnik Администратор
Отправлено: 16 Апреля, 2008 - 08:38:02
Post Id



ExBB Developer Team


Покинул форум
Сообщений всего: 778
Дата рег-ции: Дек. 2007  

Карма 0




.. я тороплюсь.. я даже не представляю себе что такое:

$_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR']$_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR']
итдд.. для меня тот код что ты написал.. загадка Огорчение
 
 Top
Furax
Отправлено: 16 Апреля, 2008 - 08:40:20
Post Id



Бледнотик


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007  
Откуда: Иркутск, Сибирь, СССР

Карма 32




Systemnik
Называется, если не ошибаюсь, трёхаргументный оператор. Длиннее
CODE:
$a = (isSet($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'])
можно написать так:
CODE:
if (isSet($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'])
$a = $_SERVER['HTTP_X_FORWARDED_FOR'];
else
$a = $_SERVER['REMOTE_ADDR'];

(Отредактировано автором: 16 Апреля, 2008 - 08:40:57)

 
 Top
Systemnik Администратор
Отправлено: 16 Апреля, 2008 - 08:46:07
Post Id



ExBB Developer Team


Покинул форум
Сообщений всего: 778
Дата рег-ции: Дек. 2007  

Карма 0




Kizim
вместо строки
CODE:
$sql = @mysql_query("SELECT * FROM `$mysql_table` WHERE `username` = '$userlogin' LIMIT 1");

напиши
CODE:
$sql = @mysql_query("SELECT * FROM `$mysql_table` WHERE `username` = '".addSlashes($userlogin)."' LIMIT 1");

это мой косяк.. если не исправиш
это будет sql иньект..

(Отредактировано автором: 16 Апреля, 2008 - 08:50:50)

 
 Top
Furax
Отправлено: 16 Апреля, 2008 - 09:05:19
Post Id



Бледнотик


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007  
Откуда: Иркутск, Сибирь, СССР

Карма 32




Или заюзай мой скрипт - вроде, работает... Радость
 
 Top
Systemnik Администратор
Отправлено: 16 Апреля, 2008 - 09:07:42
Post Id



ExBB Developer Team


Покинул форум
Сообщений всего: 778
Дата рег-ции: Дек. 2007  

Карма 0




гыы фуракс я не сомневаюсь что у твоего скрипта есть ряд достоинств перед моим..
но автору как начинающему.. советую юзать мой Язычок
у тебя фуракс втреаются непонятные массивы и операторы.. Растерялся

(Отредактировано автором: 16 Апреля, 2008 - 09:07:56)

 
 Top
Kizim
Отправлено: 16 Апреля, 2008 - 09:08:34
Post Id


Newbie


Покинул форум
Сообщений всего: 12
Дата рег-ции: Апр. 2008  

Карма 0




Вот терь окончательно запутали)
CODE:
$sql = @mysql_query("SELECT * FROM `$mysql_table` WHERE `username` = '$userlogin' LIMIT 1");

где эта строка?

Зачем это?
CODE:
<?php

function createPwd($Size) //Создание случайного пароля
{
$pwd='';
$symbols='abcdefghijklmnopqrstuvwxyz0123456789'; //Символы
$length=strlen($symbols);

while ($Size--) //$Size символов
$pwd.=$symbols{mt_rand(0, $length-1)};

return $pwd;
}


function showForm($Text = NULL)
{
if ($Text)
echo $Text;

?>


Кстати спасибо за 2ю версию) она вроде норм
 
 Top
Systemnik Администратор
Отправлено: 16 Апреля, 2008 - 09:10:29
Post Id



ExBB Developer Team


Покинул форум
Сообщений всего: 778
Дата рег-ции: Дек. 2007  

Карма 0




CODE:
if($_POST['page'] == "auth")
{
$sql = @mysql_query("SELECT * FROM `$mysql_table` WHERE `username` = '$userlogin' LIMIT 1");
if(mysql_num_rows($sql) != 0)
{

видиш?


Вот. гыыыы я ж гвоорил... Ха-ха это многоуважаемый что бы вы спро..
тоесть что бы генерировать случайный пароль и записыать в базу..
что бы впоследуюющем скрипт знал что ты залогинен Улыбка

Короче щас я свой скрипт модифицирую.. и выложу что бы у вас больше вопросов не оставалось.. Улыбка

(Отредактировано автором: 16 Апреля, 2008 - 09:21:58)

 
 Top
Furax
Отправлено: 16 Апреля, 2008 - 09:21:37
Post Id



Бледнотик


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007  
Откуда: Иркутск, Сибирь, СССР

Карма 32




Kizim
mysql_connect() стоит в 32 строке. createPwd() генерирует временный пароль. Когда юзер логинится, этот пароль сохраняется в cookie, и пользователь может ходить по остальным запароленным страницам, не вводя пароль вторично. Но через 10 минут (или после закрытия браузера, смены IP-адреса) пароль требуется снова.

CODE:
function showForm($Text = NULL)
{
if ($Text)
echo $Text;

?><form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
Логин: <input type="text" name="login"><br>
Пароль: <input type="password" name="pwd"><br>
<input type="submit" value="Войти">
</form><?php

die('');
}
Эта функция выводит форму ввода имени и пароля. По-хорошему, здесь надо прописать полную структуру HTML-документа, поскольку до ввода пароля кроме этой формы ничего не отображается, но мне лень - пропиши сам, если хочешь.
 
 Top
Страниц (4): « 1 2 [3] 4 »
Сейчас эту тему просматривают: 10 (гостей: 10, зарегистрированных: 0, скрытых: 0)
« PHP/Perl »


Все гости форума могут просматривать этот раздел.
Только администраторы и модераторы могут создавать новые темы в этом разделе.
Только администраторы и модераторы могут отвечать на сообщения в этом разделе.
 



Форум на AlfaSpace.NET


Powered by ExBB
ExBB FM 1.0 RC1 by TvoyWeb.ru
InvisionExBB Style converted by Markus®

[Script Execution time: 0.0507]     [ Gzipped ]



Notice: ob_end_flush(): failed to send buffer of ob_gzhandler (1) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/page_tail.php on line 33