Авторизация php+MySql. Принципы.

Shpion

Новичок
Авторизация php+MySql. Принципы.

Доброе утро(день/вечер/ночь), у меня возникла проблема.
Ваш форум просмотрел, но точного ответа не нашел.

Вообщем, делаю сайт.

Смысл всего проекта такой:
пользователь заходит на index - страницу. Там ему предлагают ввести логин и пароль. Если он проходит данную авторизацию, то для него генерируется страница, которая содержит файлы(отчеты), предназначенные только для него. Отчеты берутся из папки
www/admin/file/$login(логин пользователя). То есть, для каждого пользователя создается своя папка.
На странице генерируются ссылки на эти документы.

?) Как сделать так, чтобы папка admin/file(и, соответственно все подпапки) были доступны ТОЛЬКО пользователям из БД и администратору, а папка admin только админу ?

Я выбрал способ регистрации с помощью заголовка. То есть , если пользователь ввел данные в форму(а их правильность проверяется по БД), то его браузеру посылается соответствующий заголовок.

Код приведу ниже, но вопрос в другом(по правильной структуре):


К скриптам в папке admin ни через фтп, ни через хтмл доступа не будет, но к папкам , в которых хранятся файлы - будет! Они же не запаролены от фтп...

А если паролить через .htaccess, то будет двойная авторизация...

Вот код авторизации:

PHP:
<?php
global $PHP_AUTH_USER,$PHP_AUTH_PW; 


$dbhost = "localhost";  
  $db_name = "ust";  
  $dbuser = "root";  
  $dbpassword = ""; 
$db = mysql_connect($dbhost,$dbuser,$dbpassword);  
mysql_select_db($db_name,$db);

if(!isset($PHP_AUTH_USER))  
  {  
    Header("WWW-Authenticate: Basic realm=\"Access denied\"");  
    Header("HTTP/1.0 401 Unauthorized");  
 print("Защищенная директория. Введите логин и пароль"); 
     
 exit();  
  }  
  else  
  {  
        $password = "$PHP_AUTH_PW";  
        $result=mysql_query("SELECT pass FROM idllogon WHERE login=\"$PHP_AUTH_USER\"");  
        if(!$result) exit(mysql_error());  
            $row=mysql_fetch_array($result);  
        if ($row==NULL)  
        {  
          Header("WWW-Authenticate: Basic realm=\"Admin Center\"");  
          Header("HTTP/1.0 401 Unauthorized");  
          exit();  
        }  
        else  
        {  
          $real_password="$row[pass]";  
          if ($real_password!=$password)  
          {  
            Header("WWW-Authenticate: Basic realm=  
                                \"Access denied\"");  
            Header("HTTP/1.0 401 Unauthorized");  
            exit();  
          }  
       }  
  } 

?>
Праверьте на правильность. А то он работает, вроде, но нестабильно...
Но, пока вопрос в по самой структуре

Заранее спасибо.
 

Фанат

oncle terrible
Команда форума
Ответль сначала, пожалуйста, на несколько вопросов
Как сделать так, чтобы папка admin/file(и, соответственно все подпапки) были доступны ТОЛЬКО пользователям из БД и администратору, а папка admin только админу ?
никак.
и непонятно, зачем туда доступ админу.
К скриптам в папке admin ни через фтп, ни через хтмл доступа не будет
а что в папке админ делают скрипты?
Особенно, если доступа к ним не будет.
Они же не запаролены от фтп...
С чего это ты взял?
А если паролить через .htaccess, то будет двойная авторизация...
С чего ты взял?

-~{}~ 14.10.06 18:33:

А то он работает, вроде, но нестабильно...
В чём выражается нестабильность?
 

Shpion

Новичок
Фанат

Админ - это в смысле создатель сайта. То есть при вводе пароля определяется - кто пытается его ввести - по полю выпадающего списка(администратор/клиент).

Структура такая:

на выделенном мне пространстве я создаю подпапку - admin, в которой будут лежать скрипты. В папке admin будет создана папка file. Это папка для пользовательских файлов, причем для каждого пользователя опять же программно создается(при добавлении пользователя в БД) папка с именем пользователя.

Задача в том, чтобы запаролить доступ к папке admin и всем остальным, лежащим в ней.

Если просто положить в папку admin файл .htaccess, то тогда будет двойная авторизация, то есть сначала мы сверяем поля ввода с данными из базы, потом открывается доступ к папкам с файлами, но в папках лежит .htaccess, т.о., помимо "невидимой" авторизации с помощью БД, нам выскакивает окошко апачевской авторизации...

Я выбрал способ с помощью заголовка(код выше).


Они же не запаролены от фтп...
--------------------------------------------------------------------------------
>>С чего это ты взял?

Ну, обычным сайт viewer'ом можно их "вытащить"...



--------------------------------------------------------------------------------
А то он работает, вроде, но нестабильно...
--------------------------------------------------------------------------------
>> В чём выражается нестабильность?

Ну, нестабильность заключается в том, что этот файл со скриптом(pass.php) я добавляю в начало страницы(<include "pass.php">
<html>
<head>
...
),

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

Если мои суждения о структуре неправильные, то поправьте, у меня опыта очень мало, так что не судите строго...
 

Фанат

oncle terrible
Команда форума
Ну, обычным сайт viewer'ом можно их "вытащить"...
что такое "сайт viewer", и при чём здесь фтп?
и ты хочешь сказать, что можешь вытащить что-то из запароленной папки? Когда ты такое последний раз пробовал?
Если просто положить в папку admin файл .htaccess, то тогда будет двойная авторизация, то есть сначала мы сверяем поля ввода с данными из базы, потом открывается доступ к папкам с файлами, но в папках лежит .htaccess, т.о., помимо "невидимой" авторизации с помощью БД, нам выскакивает окошко апачевской авторизации...
Да ладно!
при совпадении имени и пароля в базе с именем и паролем в .htpasswd что-то выскакивает?

-~{}~ 14.10.06 19:39:

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

-~{}~ 14.10.06 19:41:

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

Shpion

Новичок
>>и ты хочешь сказать, что можешь вытащить что-то из запароленной папки?
Дак, в том-то и дело, что с моим первым вариантом авторизации папка file(и остальные) были не запаролены...

>> при совпадении имени и пароля в базе с именем и паролем в .htpasswd что-то выскакивает?

А как проверить совпадение? Читать файл?

2 Фанат:
Объясни, пожалуйста, как правильно, ну, или, хотя бы направление дай, а то я уже совсем запутался...
 

Фанат

oncle terrible
Команда форума
Блин.
Ты можешь сделать то, что собирался?
Не фантазировать на форуме, а сесть и сделать?

-~{}~ 14.10.06 20:10:

Всё ты придумал правильно.
Осталось сесть и сделать. Не пугая себя несуществующими проблемами.

только, как я уже говорил, папку admin закрывать паролем не нужно
 

Shpion

Новичок
Ну, вообщем, я почти все более-менее сделал. Осталась только один трабл.

Система авторизации у меня такая:

с файла index.php скрипт посылает прямиком на файл data/_pass.php с содержанием:

PHP:
<?php
global $PHP_AUTH_USER,$PHP_AUTH_PW; 

function mysql_die() {
  header("HTTP/1.0 401 Unauthorized");
  header("WWW-authenticate: basic realm=\"Autoriz\"");
  include("/home/test1.ru/www/data/_Invalidpass.php");
  exit();
}

require_once("/home/test1.ru/www/data/_config.php");


if(!isset($PHP_AUTH_USER))  
  {  
     mysql_die();
  }  
  else  
  {  
      $password =$_SERVER['PHP_AUTH_PW'];  
               $result=mysql_query("SELECT pass FROM idllogon WHERE login=\"$PHP_AUTH_USER\"");  
        if(!$result) exit(mysql_error());  
            $row=mysql_fetch_array($result); 
                          
        if ($row==NULL)  
        {  
        mysql_die();
        }  
        else  
        {  
          $real_password="$row[pass]";  
     
 if  ((($_SERVER['PHP_AUTH_USER'])=='adm1n') & ($real_password==$password)) 
          
          {
          include("/home/test1.ru/www/data/admin-index.php");
          }   
          
          else       
          
          if ($_SERVER['PHP_AUTH_PW'] != $real_password)
          {  
          mysql_die();
          }  
          
          else
          
          if($_SERVER['PHP_AUTH_PW'] == $real_password)
          {
          include("/home/test1.ru/www/data/klient-index.php");
           }
       }  
  } 

?>
Как видите, здесь идет проверка на имя $Php_auth_user. Если имо=adm1n, то загружается один файл, если другое, то другой..

Чтобы к файлам нельзя было попасть "напрямую" через /data/_somescript.php, я в начало каждого файла заинклюдил почти аналогичный скрипт, только без проверки на адмиина и пользователя:

PHP:
<?php
global $PHP_AUTH_USER,$PHP_AUTH_PW; 

function mysql_die_once() {
  header("HTTP/1.0 401 Unauthorized");
  header("WWW-authenticate: basic realm=\"Autoriz\"");
  include("/home/test1.ru/www/data/_Invalidpass.php");
  exit();
}

require_once('/home/test1.ru/www/data/_config.php');


if(!isset($PHP_AUTH_USER))  
  {  
     mysql_die_once();
  }  
  else  
  {  
      $password =$_SERVER['PHP_AUTH_PW'];  
               $result=mysql_query("SELECT pass FROM idllogon WHERE login=\"$PHP_AUTH_USER\"");  
        if(!$result) exit(mysql_error());  
            $row=mysql_fetch_array($result); 
                          
        if ($row==NULL)  
        {  
        mysql_die_once();
        }  
        else  
        {  
          $real_password="$row[pass]";  
     
         
          
          if ($_SERVER['PHP_AUTH_PW'] != $real_password)
          {  
          mysql_die_once();
          }  
          
         
       }  
  } 

?>

[/php

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

В справке к переменным написано, что $PHP_AUTH_USER и $PHP_AUTH_PW заносятся в глобальные переменные, и не меняются "до закрытия браузера". Тогда, почему же происходит такая непонятливость?
 

Shpion

Новичок
Защиту средствами апача я пробовал. Еще в самом начале своего пути.
Остановился на данном способе авторизации...Просто, в моем случае, "ручная" апачевская автоизация не очень подходит...

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

WP

^_^
=)))) Улыбнуло.
Во-первых не важно апачевская или нет. Во-вторых если ты думаешь о безопасности, устрани SQL-инъекцию.
 

Shpion

Новичок
WP
Если ты про это: if (!get_magic_quotes_gpc())
{

, то сделал...

А проблема с Оперой решилась: просто браузер считал заголовки, посланные от (например) http://www.test1.ru и http://test1.ru раздельными, в принципе, и правильно... Все ссылки подправил...

А с апачевской авторизацией все просто - пароли должны находится в Базе Данных.
 
Сверху