Страниц (4): « 1 2 [3] 4 » |
|
Без описания |
Поиск в теме | Версия для печати |
Furax |
Отправлено: 16 Апреля, 2008 - 08:25:36
|
Бледнотик
Покинул форум
Сообщений всего: 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 ; Проверил у себя, вроде бы работает. |
|
|
Furax |
Отправлено: 16 Апреля, 2008 - 08:40:20
|
Бледнотик
Покинул форум
Сообщений всего: 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) |
|
|
Systemnik |
Отправлено: 16 Апреля, 2008 - 08:46:07
|
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) |
|
|
Kizim |
Отправлено: 16 Апреля, 2008 - 09:08:34
|
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ю версию) она вроде норм |
|
|
Furax |
Отправлено: 16 Апреля, 2008 - 09:21:37
|
Бледнотик
Покинул форум
Сообщений всего: 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-документа, поскольку до ввода пароля кроме этой формы ничего не отображается, но мне лень - пропиши сам, если хочешь. |
|
|
|
Поиск в теме | Версия для печати |
Страниц (4): « 1 2 [3] 4 » |
Сейчас эту тему просматривают: 8 (гостей: 8, зарегистрированных: 0, скрытых: 0) |
« PHP/Perl » |
Все гости форума могут просматривать этот раздел. Только администраторы и модераторы могут создавать новые темы в этом разделе. Только администраторы и модераторы могут отвечать на сообщения в этом разделе.
|
|
|