WebScript.Ru
C:\   главная  ::   о сайте  ::  каталог скриптов  ::  гнездо  ::  форум  ::   авторам  :: Новостройки ::   ХОСТИНГ  ::

|| разделы::
|| поиск по сайту::

|| реклама::
|| новости почтой::
Рассылки Subscribe.Ru ::



Новости сайта WebScript.Ru
Популярные статьи

Hot 5 Stories

|| рекомендуем::




HTTP Установка защиты на страницу используя MySQL и PHP.


Прислал: Stron [ 25.06.2001 @ 06:33 ]
Раздел:: [ Статьи по PHP ]


Вступление

Это - обучающая программа которая должна вам показать основы защищиты ваших страниц в сети, использующие HTTP аутентификацию. Вместо традиционного .htaccess метода ( Apache сервер), мы собираемся использовать для хранения данных о пользователях и их пароли в MySQL. Я постараюсь максимально разжевать все на, что по моему разумению требуется для начинающего изучать MySQL и PHP. В принципе на основе этой проги вы можите использовать любой DBMS (система управления базы данных). Почему интересен этот метод? Ну например хотя бы потому что, если Вы используете базу данных, вы можите с легкостью разрешить, только определенной группе (человеку) иметь определенныйе права для доступа к той или иной информации. Если Вы используете традиционный .htaccess метод Апач, Вы должны вручную добавлять пользователей и пароль в файле пароля. А приимущество данного метода, ну....взгляните сами.
Программное обеспечение которое необходио:

· *nix платформа (Linux, Unix, *BSD) · PHP 3.0.x или PHP 4.x · MySQL (любая версия)


Шаг номер один

- Вперед, первое что надо это выяснить что мы хотим позволить пользователям, которые находится в нашей базе данных, чтобы получить доступ к указанной странице? И как мы собираемся это сделать? ( многим не очень нравится, но надо привыкать перед программированием брать бумажку и записывать все требования, которые мы хотим получить от проги, в перспективе вы сэкономите часы а может дни, для внесения изменений в код (прим.))

  1. Проверить, заверен ли пользователь уже.
  2. Если нет, отправить сообшение в броузер, с сообщением и формой для доступа.
  3. Если пользователь княпает на кнопку отмены, не позволить ему доступ и переадресовывать его идти на... 403: Доступ отвергнут, или показать (кукиш J ) простое сообщение.
  4. Если пользователь заполнил username и комбинацию пароля, проверьте их в MySQL базе данных и удостоверятся, что они верны, при положительном исходе разрешить доступ.

Если Вы не поняли все не волнуйтесь, станет ясно позже (а может никогда)!

Шаг Два - Создаем Нашу Базу данных

Мы хотим, чтобы база данных хранила имена (login) и пароль наших пользователей. Требуемые поля могут легко быть добавлены к существующей базе данных, но мы предположим пока, что Вы не добавляете к уже имеющейся базе а создаете новую. Следующий код это описание того как это сделать. Предположение если у вас на компе стоит Апач совсем что надо, можете немедленно приступить : )

mysql> create database members;
mysql> create table users (
username varchar(25) NOT NULL,
password varchar(15) NOT NULL,
primary key (username),
unique username (username)
);

Мы теперь имеем базу данных, чтобы хранить в ней пользователей, она предполагает, что username до 25 знаков, и пароли до 15 знаков. (если вам по каким-то причинам не подходит, установите как посчитаете Нужным) Username должен иметь значение "первичный ключ" и быть "уникальным", так как мы не хотим чтоб 2 или больше людей имели одинаковый username.
Пожалуйста обратите внимание, что usernames будет чувствитен к следующему случаю, пользователь 'Vasya' будет идентифицирован другим, нежели пользователь 'vasya', проще говоря чувствителен к регистру. Теперь мы добавим в MySQL тестового пользователя, чтобы использовать его дянные для тестов, когда мы создадим PHP страницу.

mysql> grant select on members.users
to http2user@localhost
identified by 'MyPassword';

Это для того чтоб, когда мы хотим проверить пользователя и пароль, человека зарегистрировавшегося в нашей базе данных, мы будем использовать пользователя "http2user" с паролем "MyPassword". Наконец мы должны добавить логин и пароль человека, которому мы хотим позволить доступу .

mysql> insert into users value('john_doe', 'eod_nhoj');

Я сознательно в проге не шифровал данные, для того, чтоб в случае утери пароля не дешифровать его, и упростить до минимума получения оного : )) Все, с MySQLпокончено теперь идем дальше!

Шаг Три - пишем PHP код.

Прежде, чем мы начинаем, я опишу в кратце то, что будет делать пага. Когда Вы попадете на защищенную страницу то сервер пошлет запрос и выведет страницу для введения имени и пароля. Если вы нажмете на кнопку отмены или введете не правельные данные то сервер отправит вам ( 401 Неправомочный удар головой, и будет отрицать доступ. ) - так переводит промпт обычно строку (401 Unauthorized header, and deny access) не буду пояснять по моему лучше не скажешь!!! При случае если вы все введете как надо, то окажется что просто напросто вы получите доступ (то что и требовалось доказать) Теперь самое веселое, это и есть тот самый код. Он написан сознательно с номерами строк, после кода (внизу) даны пояснения к строкам.

---
01 <?php
02
03 function access_denied() {
04 echo "401 Unauthorized: The username / password combination you entered was invalid.n";
05 }
06
07 function auth_headers($title) {
08 Header("WWW-Authenticate: Basic realm="$title"");
09 Header("HTTP/1.0 401 Unauthorized");
10 }
11
12 if(!isset($PHP_AUTH_USER)) {
13 auth_headers("My Protected Web Page");
14 access_denied();
15 exit;
16 }
17 else {
18
19 $hostname = "localhost";
20 $username = "http2user";
21 $password = "MyPassword";
22 $database = "members";
23
24 $query = "select username,password from users where username='$PHP_AUTH_USER' and password='$PHP_AUTH_PW'";
25 $link = mysql_connect($localhost, $username, $password) or die("Unable to connect to database server");
26
27 if (mysql_num_rows(mysql_db_query($database, $query)) == 0) {
28 auth_headers("My Protected Web Page");
29 access_denied();
30 exit;
31 }
32
33 mysql_close($link);
34 }
35 ?>

Вот и весь фокус - покус, работает проверенно можете использовать, где хотите когда хотите и как хотите, меняйте, улучшаете, если вам удасться сократить код до двух строк при сохранении функциональных возможностей проги, то обязательно пришлите его мне!!!

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

Строка 3:
Эта функция покажет сообщение, если "злой юзер" упорно будет вводить левые данные. Я сделал это функцией, потому что используем ее дважды, и просто чтоб сократить исходный код.
Строка 7:
Так как мы используем этот заголовок тоже дважды я также сделал это функцией.
Строка 8:
Передать броузеру заголовок, который заставит таки юзера ввести логин и пароль. Переменная $title будет показана в login диалоге.
Строка 9:
При первом запросе выводится заголовок при повторной отмене выводит сообщение о запрете доступа.
Строка 12:
$PHP_AUTH_USER цикл который выводит сообщение о том что мол пага защищена, и убирайся вон!
Строка 19-23:
Это то что кроме вас никто не знает, то есть средства для коннекта с базой данных, имя хоста, имы базы, имя юзера, и пароль. (для соеденения с MySQL)
Строка 24:
Запрос к MySQL который возвращает имена и пароли.
Строка 25:
Установить связь с MySQL и вывести ругательство если связи не будет!!! (это значит что у вас что-то не то в строках 19-23, или вообще нет MySQL)
Строка 27:
Обработать $query. Если возвращет - 0, это означает, что была введена недействительная комбинация.
Строка 33:
Разъединить соеденение с MySQL.

Я рекомендовал бы сохранить PHP код в файле под наванием user_auth.php, user_auth.php3, или... (тут ваша фантазия на эту тему) Предположим, что таки сохранили этот код в файле user_auth.php. Всякий раз, когда мы захотим вдруг защитить нашу сверхсекретную пагу в сети, мы просто подключаем этот файл. Единственное на что хочется обратить внимание, что по логике надо подключать в самой верхней части своей защищенной PHP страницы, советую в строке номер 1 ваше паги написать следующее:

<?php require("user_auth.php"); ?>

где "user_auth.php" это имя файла под которым вы сохранили код.

Ваш вопрос - я не использую MySQL, как быть?
Посоветуйтесь с админом вашего сервера, если он окажется добрым, то он вам поможет, для него это 5 минут работы, если злой то не поможет, тогда идите на форум относящийся к той БД которую вы исьпользуете и кричите о помощи! Или если вы считаете себя нормальным программером, то...вам вообще этот код не понадобиться, и вы будите создавать "сессии", шифровать с помощью PGP вобщем извращаться так, как быдто вы делаете защиту для amazon.com

Удачи! : )




 :::::  Влад пишет 25.06.2001 @ 14:50 
Помоему, файл, включаемый, командой require, исполняться. не будет :(
Для этого не обходим include. Разве не так?
 :::::  Sanches пишет 26.06.2001 @ 13:52 
Mda veselo...:-)
Ya kakraz v forume sprashival na etu temu, tolko nafiga bazu yuzat?
Mojno PHP fayl includit s peremennimi tipa:
$login="Vasya";
$pasword="Pupkin";
I ne predetsya admina razvodit na predastovlenie bazi...:-))

WBR.Sanches
 :::::  dina пишет 13.07.2001 @ 01:27 
в самом деле этот способ больно простоват, и проще сделать проверку:
if ($login="Vasya" and $pasword="Pupkin") open page....
else acsess denied....

тем более если у меня в защищенном каталоге 50 файлов? что, при открытии каждого связываться с базой и спрашивать пароли?
тут то и нужны сессии, чтоб 1 раз спросить пароли, а потом в сессию вписать
$login=true, и в начале каждой страницы вписать условие if ($login)

 :::::  Stron пишет 16.07.2001 @ 06:16 
Ну приветики всем! :)
Народ не надо все так серьезно воспринимать, я статейку накропал не затем чтоб ее так серьезно обсуждать, а по поводу всяких вариантов то смотри последние три строчки статейки (см.выше). Я нарисовал сей панегерик только для того чтоб понять некоторые принципы, и взять их себе на заметку, вед даже матерым программерам, иногда приходится смотреть кой чего и не только в доках к тому или иному языку программирования, иногда важен просто алгоритм, который можно будет приминить где-то когда-то или на его основе сделать что-то свое : ))
Я думаю если такая реакция то напишу еще пару интересных заметок, не сегодня завтра положу, будет на чем "отдохнуть" занимаясь критикой :) ))
Удачи.
 :::::  Сидор пишет 08.08.2001 @ 02:22 
Все это клево но есть ли где нибудь халявные сервера поддерживающие PHP и MySQL
 :::::  Макс пишет 19.09.2001 @ 14:43 
А мне понравилась статья, по крайней мере узнал, что есть такой способ защиты страничек - до сих пор я использовал еще более кривой. Хотя уверен - обойти его - раз плюнуть, но все же это лучше чем ничего. Хотя у себя я использовал вариант предложенный dina - т.е. не использовал mysql - так быстрее работает!
 :::::  Дмитрий пишет 28.11.2001 @ 23:25 
Я конечно не знаю, но у меня этот кусок кода не заработал а написал что ошибка в 8 строке. Подскажите если у кого уже такое было.
 :::::  Slava пишет 14.12.2001 @ 23:56 
2 Дмитрий:

Всё очень просто - что бы послать хедер, что и делает восьмая строка, необходимо что бы ранее он не был послан, а пхп автоматически генерит его если перед этим ты чё-нить выводил (типа echo "...."). Выход прост - ничего не выводить до исполнения приведённого в статье фрагмента кода....
С уважением....
 :::::  Shurra пишет 19.11.2002 @ 09:51 
Да блин нафиг писать скрипты с ошибками, :?%:?:№. Ну блин в восьмой то строчке написаны кавычки внутри строчки. Значит что надо? Слэш, значит, `\' поставить! Уважаемые, прежде чем писать свои скрипты, уж проверьте их работу, хотябы...

Header("WWW-Authenticate: Basic realm=\"$title\"");
 :::::  Алексей пишет 14.01.2003 @ 01:02 
У меня вопрос. Почему у меня не хочет работать вот этот код :

header("HTTP/1.1 401 Unauthorized");
header("WWW-Authenticate: Basic realm=\'My Realm\'");
error("Извините, у вас нету прав доступа к этим файлам ");

Пишет ошибка скрипта (500)

В логах написано:
[Mon Jan 13 18:20:33 2003] [error] [client xxx.xxx.xxx.xxx] malformed header from script. Bad header=HTTP/1.0 401 Unauthorized: e:/usr/local/php3/php.exe
 :::::  Алексей пишет 14.01.2003 @ 01:02 
У меня вопрос. Почему у меня не хочет работать вот этот код :

header("HTTP/1.1 401 Unauthorized");
header("WWW-Authenticate: Basic realm=\'My Realm\'");
error("Извините, у вас нету прав доступа к этим файлам ");

Пишет ошибка скрипта (500)

В логах написано:
[Mon Jan 13 18:20:33 2003] [error] [client xxx.xxx.xxx.xxx] malformed header from script. Bad header=HTTP/1.0 401 Unauthorized: e:/usr/local/php3/php.exe
 :::::  Алексей пишет 14.01.2003 @ 01:02 
У меня вопрос. Почему у меня не хочет работать вот этот код :

header("HTTP/1.1 401 Unauthorized");
header("WWW-Authenticate: Basic realm=\'My Realm\'");
error("Извините, у вас нету прав доступа к этим файлам ");

Пишет ошибка скрипта (500)

В логах написано:
[Mon Jan 13 18:20:33 2003] [error] [client xxx.xxx.xxx.xxx] malformed header from script. Bad header=HTTP/1.0 401 Unauthorized: e:/usr/local/php3/php.exe
 :::::  Алексей пишет 14.01.2003 @ 01:02 
У меня вопрос. Почему у меня не хочет работать вот этот код :

header("HTTP/1.1 401 Unauthorized");
header("WWW-Authenticate: Basic realm=\'My Realm\'");
error("Извините, у вас нету прав доступа к этим файлам ");

Пишет ошибка скрипта (500)

В логах написано:
[Mon Jan 13 18:20:33 2003] [error] [client xxx.xxx.xxx.xxx] malformed header from script. Bad header=HTTP/1.0 401 Unauthorized: e:/usr/local/php3/php.exe
 :::::  Viktor Baiznov пишет 22.01.2003 @ 19:39 
Ljudi a kak ispravitj etot skript chtobi on perenapravljal ljudej posle vvoda parolja
na druguju stranicu?
naprimer http://vsk15.latg.lv/chat/?user=admin esli avtorizirovalsja admin i
http://vsk15.latg.lv/chat/?user=viktor esli avtorizirovalsja viktor
????mozhno eto?

napishite please otvet na mail!!!
Best regards Viktor Bazinov
 :::::  SYSTEM пишет 20.06.2003 @ 13:03 
Алесей

Взможно надо установить PHP как модуль для Apache 2
 :::::  Ed пишет 08.08.2003 @ 23:48 
header("HTTP/1.1 401 Unauthorized");
header("WWW-Authenticate: Basic realm=\'My Realm\'");
Этио дело неподдержуется в Опере.
 :::::  Nord пишет 15.01.2004 @ 14:07 
Ed, в опере всё поддерживается и нормально работает
 :::::  AL пишет 14.02.2004 @ 15:28 
Ed, ну навернаое опера первых версий у тебя :)
 :::::  nemoluca пишет 16.03.2004 @ 18:18 
Согласен с Ed. Опера рубит энто дело...
Опера 7.20
php 4.0.5
Имя:
Email:
URL

Введите сумму двух чисел семь и шесть (семь+шесть=?)
Запомнить мою информацию

* Html запрещен* Ваш E-mail опубликован не будет.

Copyright © 2000-2001 WebScript.Ru nas@webscript.ru
Design © 2001 by Parallax Design Studio (aka Spectator.ru)
Все торговые марки и авторские права на эту страницу принадлежат их соответствующим владельцам.
Сгенерировано за: 0.0159681