Перейти к содержимому

Фото
- - - - -

PHP


  • Вы не можете создать новую тему
  • Please log in to reply
17 ответов в этой теме

#1 .NET

.NET
  • Постоялец
  • 3 511 сообщений

Отправлено 20 июня 2005 - 15:30

Привет всем. Имеется скрипт авторизации написанный мною(сразу говорю - ГОВНО :) ). Задача: сделать checkbox при значении checked которого, логин и пароль сохранаются на 2 недели. И еще одна задача: установить шифрование MD5. Вот скрипт из нескольких фаилов:
auth.php
[<HTML>
<HEAD>
<TITLE>Администрировние</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
</HEAD>
<BODY>
<CENTER>
<?

if ($log=="abcde" && $pass=="abcd") {

echo "<p align=center><b>Доступ:</b> <font color=green><b>Открыт</b></font><BR>Добро пожаловать <u>Админ</u></p>";

} else {

echo "<p align=center><b>Доступ:</b> <font color=red><b>Закрыт</b></font><BR>Неверный Логин или Пароль</p>";

}

?>

<?php

if (empty($pass)) {

echo "<p align=center><b><font color=red>Ошибка. </b></font>Не введен Пароль. Вернитесь и проверьте данный параметр.</p>";

}

?>

<?php

if (empty($log)) {

echo "<p align=center><b><font color=red>Ошибка. </b></font>Не введен Логин. Вернитесь и проверьте данный параметр.</p>";

}

?>
</BODY>
</HTML>
login.php
<html>
<head>
<title>Вход в закрытую зону</title>
</head>
<body  bgcolor="#FFFFFF">
<center>
<form action="auth.php" method="POST">
<b><font color=red>Доступ только доверенным лицам</font></b><br><br>
Логин<font color=red>*</font>:&nbsp;&nbsp;<input name="log" type="text" value="" /><br><br>
Пароль<font color=red>*</font>:<input name="pass" type="password" value="" /><br><br>
<input type="submit" name="enter" value="Вход" />
<input type="reset" name="reset" value="Сброс" /><br><br>
<li><font color=red>*</font> - Является обязательным для заполнения.
</form>
</center>
</body>
</html>

Сообщение изменено: Z_e_N! (20 июня 2005 - 15:33 )

  • 0

#2 u1tra

u1tra
  • Пользователь
  • 24 сообщений

Отправлено 20 июня 2005 - 15:38

используй sha1 шифрование, md5 более совсем не надёжно
  • 0

#3 .NET

.NET
  • Постоялец
  • 3 511 сообщений

Отправлено 20 июня 2005 - 15:40

Я использую все что посоветуйте, одна проблема я не умею этого поставить. Изучаю ПХП всего неделю. Он мне безумно нравится. И мои результаты(невпечатляющие) - это сабж
  • 0

#4 ParadoxL

ParadoxL
  • Постоялец
  • 5 023 сообщений
  • Откуда:Edinburg

Отправлено 21 июня 2005 - 12:45

Вот накидал кое-что для тебя, надеюсь разберешься! Информация о пользователях хранится в файле users.xml. В тегах <password> хэш пароля. В соответвующих коментах сам пароль (желательно в реальной модели убрать). И этот сам файл надо прятать в директорию, которая не доступна через HTTP интерфейс. Ну и прочие приблуды по безопасности. Файл имеет следующий вид :
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <user login="cyburglar">
  	<!-- password : kindzadza -->
	<password>402b142c95de7623ca85ec9ba33d1099</password>
  	<realname>Alex Burg</realname>
    <role>admin</role>
    <homepage>http://www.cyburglar.ee/cv.pdf</homepage>
    <e-mail>[email protected]</e-mail>
  </user>
  <user login="bin_laden">
  	<!-- password : vsem_pizdec -->
	<password>603f3c62b51d289e88ed66a4e0e99b64</password>
  	<realname>Usama Bin Laden</realname>
    <homepage>http://www.seprin.com/laden/</homepage>
  	<role>moder</role>
    <e-mail>[email protected]</e-mail>
    <comment>Буш чмокает писю! :)</comment>
  </user>
  <user login="marfa">
	<!-- password : otsosu_za_tak -->  
	<password>5a733149cbefb879bf62d71572db87b8</password>
  	<realname>Марфа Васильевна</realname>
    <homepage>http://www.lukomorje.ru/</homepage>
  	<role>girl</role>
    <e-mail>[email protected]</e-mail>
    <comment>Интим не предлагать</comment>
  </user>
</root>

Для разбора написал маленький парсер XML (файл users_parser.php) , который лазит по контенту users.xml и ищет пользователя заданого переменной $search_for . если находит, то устанавливает бит $found в истину. Вот исходник парсера :
<?php

if (!defined("NO_JOKE"))
	die("Ахтунг ... некоректный доступ");

$insideuser = false;
$tag = "";
$found = false;
$search_for = "";


$login = "";
$password = "";
$realname = "";
$role = "";
$e_mail = "";
$homepage = "";
$comment = "";

function startElement($parser, $name, $attrs) {
	global $insideuser, $tag, $login, $found;
	if ($found) return;
	if ($insideuser) {
  $tag = $name;
	} elseif ($name == "USER") {
  $insideuser = true;
  $login = $attrs['LOGIN'];
	}
}

function endElement($parser, $name) {
	global $found, $insideuser, $tag, $password, $realname, $role,$login,$e_mail,$search_for , $comment, $homepage;
	$tag = "";
	if ($found) return;
	if ($name == "USER") {
  $insideuser = false;
  if ($login == $search_for) {
  	$found = true;
  } else {
  	$login = "";
  	$password = "";
  	$realname = "";
  	$role = "";
  	$e_mail = "";
  	$comment = "";
  	$homepage = "";
  }
	}
}

function characterData($parser, $data) {
	global $found,$insideuser, $tag, $password, $realname, $role,$e_mail, $comment, $homepage;
	if ($found) return;
	if (!$insideuser) return;
  switch ($tag) {
  case "PASSWORD":
  	$password = $data;
  	break;
  case "REALNAME":
  	$realname = $data;
  	break;
  case "ROLE":
  	switch ($data) {
    case "admin" : 
    	$role = "Администратор"; 
    	break;
    case "moder" : 
    	$role = "Модератор"; 
    	break;
    case "girl" : 
    	$role = "Женщина"; 
    	break;
  	}
  break;
  case "E-MAIL":
  	$e_mail = $data;
  	break;
  case "HOMEPAGE":
  	$homepage = $data;
  	break;
  case "COMMENT":
  	$comment = $data;
  	break;

  }
}

function searchForUserInXML($db_file) {
	global  $found;
	$xml_parser = xml_parser_create(); 
	xml_set_element_handler($xml_parser, "startElement", "endElement"); 
	xml_set_character_data_handler($xml_parser, "characterData"); 
	$fp = fopen($db_file,"r") 
        or die("Запара с чтением БД пользователей."); 
	while ($data = fread($fp, 4096)) {
    xml_parse($xml_parser, $data, feof($fp)) 
        or die(sprintf("XML ошибка: %s (строка %d )",  
            xml_error_string(xml_get_error_code($xml_parser)),  
            xml_get_current_line_number($xml_parser))); 
	}
	fclose($fp); 
	xml_parser_free($xml_parser);
}


?>


Если пользователь найден ... то информацией о нем заполняются переменные $password, $realname, $role,$login,$e_mail,$comment, $homepage.

Далее ... в файле auth.php (за базу был взять твой файл) идет сама проверка на истиннсть ввденнего пароля (эго хэша) с хэшем, который у тебя в users.xml ... если условие удолетворено, то печатается информация о пользователе ... суда можно уже вставлять, что душе захочется ... как кукисы, так и другие детские обиды.
<HTML>
<HEAD>
<TITLE>Администрировние</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
</HEAD>
<BODY>
<CENTER>
<?

if (empty($e_login) || strlen(trim($e_login)) == 0) {
	die("<p align=center><b><font color=red>Ошибка. </b></font>Не введен Логин. Вернитесь и проверьте данный параметр.</p>");
}

if (empty($e_password) || strlen(trim($e_password)) == 0) {
	die("<p align=center><b><font color=red>Ошибка. </b></font>Не введен Пароль. Вернитесь и проверьте данный параметр.</p>");
}

define("NO_JOKE", 1);

include("users_parser.php");
$search_for = $e_login;
searchForUserInXML("users.xml");
if ($found) {
	printf("<dt><b>Пользователь:</b>%s</dt><dt><b>Пароль(MD5):</b>%s</dt><dt><b>Имя:</b>%s</dt><dt><b>Роль:</b>%s</dt><dt><b>Почта:</b>%s</dt><dt><b>Домашнаяя страница:</b><a href=\"%s\">Смотреть</a></dt><dt><b>Коментарий:</b>%s</dt><br><br>",
  	trim($login),htmlspecialchars(trim($password)), trim($realname) , trim($role) , trim($e_mail), trim($homepage) , trim($comment) );
}

if ($found && $password == md5($e_password)) {
	echo "<p align=center><b>Доступ:</b> <font color=green><b>Открыт</b></font><BR>Добро пожаловать <u>".$role."</u></p>";
} else {
	echo "<p align=center><b>Доступ:</b> <font color=red><b>Закрыт</b></font><BR>Неверный логин или пароль</p>";
}


?>
</CENTER>
</BODY>
</HTML>

И я немного подправил login.php (имена объектов input сменил, чтобы ты не запутался).

<html>
<head>
<title>Вход в закрытую зону</title>
</head>
<body  bgcolor="#FFFFFF">
<center>
<form action="auth.php" method="POST">
<b><font color=red>Доступ только доверенным лицам</font></b><br><br>
Логин<font color=red>*</font>:&nbsp;&nbsp;<input name="e_login" type="text" value="" /><br><br>
Пароль<font color=red>*</font>:<input name="e_password" type="password" value="" /><br><br>
<input type="submit" name="enter" value="Вход" />
<input type="reset" name="reset" value="Сброс" /><br><br>
<li><font color=red>*</font> - Является обязательным для заполнения.
</form>
</center>
<br>
</body>
</html>


Рабочий пример можешь наблюдать здесь. Пытался всё максимально упростить ... надеюсь мне удалось быть максимально доступным :) . Если чё не понятно ... то пиши в эху, если даст Бог загляну то отвечу. Или тут местные "умельцы" помогут.

ЗЫ! Да, переменная NO_JOKE используется как провка на то что auth.php является обложкой для парсера.

ЗЗЫ! Делал на скору руки, так что критикофф просим помолчать!!!
  • 0
Victoria nulla est, Quam quae confessos animo quoque subjugat hostes ...
Верю в смерть после жизни, любовь после секса и в крем после бритья ...

#5 .NET

.NET
  • Постоялец
  • 3 511 сообщений

Отправлено 21 июня 2005 - 19:44

Спасибо, огромное хоть один откликнулся...Но я сразу в твоей версии баг нашел, разясню: если пароль и логин ВЕРНЫ, то предоставляет информацию о том кто вошел, однако, под ними написано Доступ: Закрыт
  • 0

#6 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 21 июня 2005 - 23:14

Ой, как сложно вы пытаетесь сделать...

Пользователь заходит на сайт... index.php
function is_logged()
{
    if ( ! isset( $_SESSION['logged'] ) )
        return false;
    else
        return true;
}

if ( ! is_logged() && isset( $_COOKIE['login'], $_COOKIE['hash'] ) )
{
    $login = 'login';
    $pass = 'password';

    if( $_COOKIE['login'] == $login && $_COOKIE['hash'] = sha1( $pass ) )
    {
         session_start();
         $_SESSION['logged'] = 1;
    }
    else
    {
         // пароль неверный, убиваем кукисы (думаю, на компе юзера и на сервере даты не будут различаться более чем на 7 дней;))
        setcookie( 'login', '', time() - 86400 * 7 );
        setcookie( 'pass', '', time() - 86400 * 7 );
    }
}

Там, где мы авторизуемся вручную:
// Если поставлена галочка на автологин, то на неделю запоминаем юзера
if ( isset( $_POST['autologin'] ) )
{
    setcookie( 'login', $login, time() + 86400 * 7 );
    setcookie( 'pass', sha1( $pass ), time() + 86400 * 7 );
}

if( $_POST['login'] == $login && $_POST['pass'] == $pass )
{
    session_start();
    $_SESSION['logged'] = 1;
}

Если мы не хотим хранить пароль или его хеш в куках, то после каждого успешного логина можно генерировать уникальную абракадабру и её хешь класть в базу. Например, можно воспользоваться этой функцией:

function random_hash()
{
    return sha1( uniqid( rand(), 1 ) );
}

Добавлено в [mergetime]1119388485[/mergetime]
Откуда вы будете брать имя и пароль - ваше дело. Можно взять пример CyBurglar'а, но будет сложно управлять пользователями... я в подобных случаях использую самое простое:

passwords.txt
username1::password::other_info::
username2::password::other_info::

parser.php
$login_data = file( 'passwords.txt' );

foreach( $login_data as $line )
{
    list( $login, $password, $other_data ) = explode( '::', $line );
    $auth[$login] = array( 'pass' => $password, 'other_data' => $other_data );
}

// проверка логина
$login = $_POST['login'];
if ( isset( $auth[ $login ] ) )
{
   // проверяем остальное что надо...
    if ( $auth[$login]['password'] == $password ) {}
     // .
}

Сообщение изменено: Setor (21 июня 2005 - 23:26 )

  • 0

#7 .NET

.NET
  • Постоялец
  • 3 511 сообщений

Отправлено 22 июня 2005 - 07:30

Огромное спасибо тебе Setor, но я вот тут смотрю на parser.php и что то ничего не пойму...если не сложно, объясни все функции в парсере, а то я люблю разобраться во всем сам.
  • 0

#8 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 22 июня 2005 - 13:39

Z_e_N!, в парсере только стандартные функции...

http://www.php.net/имя_функции там всё написано ;)

В двух словах, сначала мы загоняем файл в массив построчно, потом мы пробегаемся по каждой строке и "разрезаем" её на кусочки (разделителем строки является ::, учти, что такой последовательности не должно быть ни в имени юзера, ни в пароле ни в доп. инфо + в конце должен стоят разделитель, иначе ты получишь ещё символ новой строки к доп. инфо). Первые 3 кусочка раскладываем по переменным и упаковываем всё в массив.

Дальше смотрим, был ли в массиве индекс под именем пользователя, если был, проверяем его пароль и т.д. если не было, то ... сам допишешь!

Добавлено в [mergetime]1119440373[/mergetime]
Для добавления нового юзера или изменения существующего:

получаем содержимое файла тем способом, что я привёл в парсере, изменяем переменные как нам нужно.

Код добавления нового юзера:
$newusername = 'petja';
$newuserpass  = sha1( 'petrovich' );
$otherdata       = 'lamer';
$auth[$newusername] = array( 'pass' = $newuserpass, 'other_data' => $newuserdata );

// файл users.txt Должен быть доступен для записи
$fp = fopen( 'passwords.txt', 'w' );
foreach ( $auth as $line => $data )
{
    $newline = $line . '::' . $data['pass'] . '::' . $data['other_data'] . "::\r\n";
    fwrite( $fp, $newline );
}

fclose( $fp);

для изменения инфы юзера admin (для изменения имени пользователя нужно кое-что изменить, думай сам ;))
$modifyuser = 'admin';
$newuserpass  = sha1( 'antihaker' );
$otherdata       = 'super haker';
$auth[$modifyuser] = array( 'pass' = $newuserpass, 'other_data' => $newuserdata );
// далее то же , что и в первом примере - сохранение

P.S. код писал находу не в редакторе с подсветкой, могут быть отпечатки... а может и не быть ;)

Сообщение изменено: Setor (22 июня 2005 - 13:40 )

  • 0

#9 zedirtybastard

zedirtybastard
  • Пользователь
  • 499 сообщений

Отправлено 25 августа 2005 - 22:19

парсер.пхп твой будет работать только в том случае, если в текстовом фале пароли хранятся в голом виде, что само по себе бред.
В любом случае с другими твоими скриптами parser.php не совместим.
И самую интересную часть, замену строки в текстовом файле ты почему-то пропустил :)
  • 0

#10 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 26 августа 2005 - 20:10

zedirtybastard, писать скрипты за человека, который не хочет пошевелить мозгами я не собираюсь... Я дал ему все необходимые наброски.

Пароли шифруются алгоритмом sha1 и замена строки в текством файле так же присутствует... ты плохо смотрел :)
  • 0

#11 zedirtybastard

zedirtybastard
  • Пользователь
  • 499 сообщений

Отправлено 27 августа 2005 - 19:06

$login_data = file( 'passwords.txt' );

foreach( $login_data as $line )
{
    list( $login, $password, $other_data ) = explode( '::', $line );
    $auth[$login] = array( 'pass' => $password, 'other_data' => $other_data );
}

// проверка логина
$login = $_POST['login'];
я про это место говорю: ты берешь переменную логин из поста, пароль из поста ты не берешь, ты берешь какой-то $password, а что это за пароль не понятно.
надо всего-то добавить:
$user_password = sha1($_POST['password']);

if ( isset( $auth[ $login ] ) )
{
   // проверяем остальное что надо...
    if ( $auth[$login]['password'] == $user_password ) {}
     // .
}


Сообщение изменено: zedirtybastard (27 августа 2005 - 19:07 )

  • 0

#12 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 29 августа 2005 - 13:57

я про это место говорю: ты берешь переменную логин из поста, пароль из поста ты не берешь, ты берешь какой-то $password, а что это за пароль не понятно.
надо всего-то добавить:
$user_password = sha1($_POST['password']);

Я ведь сказал, что это лишь наброски. Предполагается, что пароль тоже будет взят из POST'а... Тогда я по каким-то причинам не стал добавлять эту строку или забыл. Это не важно. Я показывал суть работы подобной системы!
  • 0

#13 zedirtybastard

zedirtybastard
  • Пользователь
  • 499 сообщений

Отправлено 31 августа 2005 - 08:42

Да ладно, не переживай ты так :)
Есть место вакантное, РНР-Перл програмиста, требуется в первую очередь не опыт работы, а знания. Работа в Тлн, если интересно - стучи 119730241

Я ведь сказал, что это лишь наброски. Предполагается, что пароль тоже будет взят из POST'а... Тогда я по каким-то причинам не стал добавлять эту строку или забыл. Это не важно. Я показывал суть работы подобной системы!

Просмотреть сообщение


  • 0

#14 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 31 августа 2005 - 20:55

Я из Кохтла-Ярве... Мне Таллинн не катит
  • 0

#15 zedirtybastard

zedirtybastard
  • Пользователь
  • 499 сообщений

Отправлено 31 августа 2005 - 21:31

Ну чувак, тогда бросай свой компьютер и иди на Виру Кеемия :)
В Кохтла ты все-равно нормальной работы не найдешь, а на удаленку берут неохотно да и рискованно это.
Ты вот только скажи мне, ты что и вправду решил прогнить в Кохтла всю жизнь??!!
Вообщем, дело твое, если что - номер моей аськи знаешь.

Я из Кохтла-Ярве... Мне Таллинн не катит

Просмотреть сообщение


Сообщение изменено: zedirtybastard (31 августа 2005 - 21:31 )

  • 0

#16 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 31 августа 2005 - 21:37

Тут был я... VKG сакс :)

Сообщение изменено: Setor (23 октября 2008 - 18:20 )

  • 0

#17 ParadoxL

ParadoxL
  • Постоялец
  • 5 023 сообщений
  • Откуда:Edinburg

Отправлено 01 сентября 2005 - 10:48

Setor, что такое VKG?
  • 0
Victoria nulla est, Quam quae confessos animo quoque subjugat hostes ...
Верю в смерть после жизни, любовь после секса и в крем после бритья ...

#18 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 01 сентября 2005 - 16:13

CyBurglar, http://www.vkg.ee/ :)
  • 0