Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> прокоментируйте простой доступ на страницу 
:(
    Опции темы
AmberLX
Дата 28.2.2008, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 28.2.2008

Репутация: нет
Всего: нет



Посоветуйте начинающему: хочу сделать простенькую страницу для администрирования.
Написал примерно так (по примеру из книги):

Например, есть папка www/ и в ней находится файл admin.php который содержит:

Код

<?php
define('_ADMIN_FILES', true);
if (!isset($_GET['go'])){   
    echo "<form> 
    Login: <input type=text name=login>
    Password: <input type=password name=passwd>
    <input type=submit name=go value=Go>
    </form>";
}
else { 
    if ($_GET['login']=="pit" && $_GET['passwd']=="123") { 
        include("admin/admin.php");
    }
}
?>


И есть папка www/admin/ в которой находятся файлы: 
1) admin.php который содержит:

Код

<?php
if (!defined('_ADMIN_FILES')) die("Illegal File Access");
echo "Ура! Страница администрирования";
?>


2) .htacces который содержит:

deny from all

Вопрос: можно ли в этом случае каким-либо образом прочесть или получить доступ к файлу www/admin/admin.php, если логин и пароль будет прописан в файле как здесь(и если ввод данных в форму будет проверяться)?

PM MAIL   Вверх
GeneralElectric
Дата 28.2.2008, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



А на страницу администрирования ты только смотришь, и никаких действий с ней не производишь?

И зачем такие сложные телодвижения - папка www/admin/ в которой находятся файлы...? почему нельзя сразу написать все в  www/admin.php ?
PM MAIL   Вверх
AmberLX
Дата 28.2.2008, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 28.2.2008

Репутация: нет
Всего: нет



Вообщем, как я понял, это годится если нужно только отобразить секретную информацию на странице и не более.
И если есть только одна страница.
Если там будут ссылки на другие страници то это уже не катит.

Это сообщение отредактировал(а) AmberLX - 28.2.2008, 16:53
PM MAIL   Вверх
GeneralElectric
Дата 28.2.2008, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



верно.
а простая авторизация делается немного другими средствами:
Код

<?
if (!isset($_SERVER['PHP_AUTH_USER']) OR $_SERVER['PHP_AUTH_USER'] !== 'login' OR $_SERVER['PHP_AUTH_PW'] !=="js95843kf"){
  Header('WWW-Authenticate: Basic realm="Admins"');
  Header("HTTP/1.0 401 Unauthorized");
  exit;
}
?>

включать этот код в начало всех защищаемых скриптов.
или в отдельный файл, а его потом - require 'auth.php';

Это сообщение отредактировал(а) GeneralElectric - 28.2.2008, 23:02
PM MAIL   Вверх
AmberLX
Дата 29.2.2008, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 28.2.2008

Репутация: нет
Всего: нет



Спасиба!
И еще вопросик:
Я долго лазил по форумам, искал может уже готовое решение авторизации.
Если только там кто-то и пишет свое, то в ответах только куча критики: то не так, это нада так и т.п.
Не знаешь че вообще делать и кого слушать, как не пиши все равно поломают.
Но ведь есть же готовые решения такие как у SLAED CMS, например, или каких-то других CMS?
Ее поломать наверное очень сложно, учитывая что код открытый.
Неужели никто не использует какой-то более-менее приемлимый стандартный код для авторизации?




PM MAIL   Вверх
GeneralElectric
Дата 29.2.2008, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



Исходи из аксиомы, что поломать можно все.
PM MAIL   Вверх
KonstRuctor
Дата 29.2.2008, 12:51 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 31.3.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: нет



На одном из форумов по PHP, по-моему, на руборде, видел отличную статью с комментариями о том, как сделать систему авторизации на сайте. Конечно, критика такого метода также присутствует.
Вкратце вот такой алгоритм:
1) Есть таблица admin в базе: id, name, password
2) При авторизации в сессию пишется в открытом виде id и двойной хэш пароля
3) При каждом обращении к защищенной странице идет запрос к базе, вынимается оттуда содержимое поля password (там одинарный хэш пароля), делается ему хэш еще раз и сравнивается.
4) совпало -- молодец, работай. нет - до свидания.

Делается класс авторизации, страница входа и страница выхода.
Все. далее ЛЮБОЙ скрипт выглядит примерно так:

if ( $security->is_admin() ) 
{

........ тут вся программа

}
else
{
getaway();
}
********************
Можно вместо сессии хранить инфу к куках. Я не сильно дружу с куками, поэтому делаю на сессии.
Какова критика?
Говорят, что постоянное обращение к базе тормозит всю малину.
Но так как все работает, а альтернативы на горизонте нет, я использую такой метод.
********************
Поищи самостоятельно эту статью, вещь полезная.
PM MAIL WWW ICQ   Вверх
GeneralElectric
Дата 29.2.2008, 13:06 (ссылка)  | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



критика обычная.
двойной хеш - это смешной баян. сто раз говорилось, что от количества оборотов стойкость не повышается. Лучше уж солить одинарный. Это если вообще говорить о шифровании чего-либо в сессии.
"постоянное обращение к базе" звучит так, как будто к базе у нас обращается толко система авторизации. или что если авторизация сделает мизерный запрос - это ужасно затормозит систему, а если для отображения страницы потребуется сложная выборка, то базе это раз плюнуть.
Дружить с куками или с сессиями на самом деле - одно и то же. поскольку передача сессии в урле давно уже подвергнута массовому остракизму, то остаются те же куки. Разница только в том, что туда пишется.

PM MAIL   Вверх
Staind
Дата 29.2.2008, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 17.12.2007
Где: Планета сокровищ

Репутация: 2
Всего: 3



2GeneralElectric,
а вообще нормально так?:

Код

if ( $security->is_admin() ) 
{

define ("OK_ADMIN_COMIN","Hello!");

}

if (!isset(OK_ADMIN_COMIN)) {header ("Location: error.php"); exit;}

//дальше идет код, который должен отображаться залогиненому админу.


Т.е. если это админ, то создаем какую-нибудь константу и если ее нет направлять на страничку ошибки.
--------------------
Ничто так не раздражает человека, как просьба успокоиться
PM MAIL WWW ICQ   Вверх
GeneralElectric
Дата 29.2.2008, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



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

и для констант иссет не работает

Это сообщение отредактировал(а) GeneralElectric - 29.2.2008, 13:27
PM MAIL   Вверх
Staind
Дата 29.2.2008, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 17.12.2007
Где: Планета сокровищ

Репутация: 2
Всего: 3



Понятно, значит после проверки если не верно то шлю на страничку ошибки. Спасибо.

Цитата

и для констант иссет не работает

Да, забыл.
--------------------
Ничто так не раздражает человека, как просьба успокоиться
PM MAIL WWW ICQ   Вверх
AmberLX
Дата 29.2.2008, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 28.2.2008

Репутация: нет
Всего: нет



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

Статью поищу... Спасибо

А то, что поломать можно все понятно.
Но ведь у готовых CMS есть авторизация, может лучше там рыться как работает?
Я так понимаю там серьезные люди писали, а делиться может не хотят.



PM MAIL   Вверх
GeneralElectric
Дата 29.2.2008, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



Не понял. Что значит - делиться не хотят? Ты же сам писал, что код отккрытый?
А чем тебя не устроаила та авторизация, которую я написал?
PM MAIL   Вверх
TimberWolf
Дата 2.3.2008, 15:16 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 6.1.2007
Где: Тула

Репутация: нет
Всего: нет



Для поддержания темы поделюсь своим скриптом авторизации ... Любую критику приветствую, да и народу может в чём-то поможет. Для работы скрипта нужно поменять только значение константы PASSWORD 

dbauth.php : 

Код

<?php
define("HOST", "localhost");
define("USER", "root");
define("PASSWORD", "somepassword");
define("DBNAME", "auth");

class db_auth {
    private $p;
    function __construct() {
        $this->p = mysql_connect(HOST, USER, PASSWORD) or die("Connect error " . mysql_error());
        mysql_query("CREATE DATABASE IF NOT EXISTS " . DBNAME, $this->p) or die("Can't  create database " . mysql_error());
        mysql_select_db(DBNAME, $this->p) or die("Can't select database " . mysql_error());
        mysql_query("CREATE TABLE IF NOT EXISTS users(id INT AUTO_INCREMENT PRIMARY KEY,
                                                      login VARCHAR(30),
                                                      password VARCHAR(32))", $this->p) or die("Can't create table " . mysql_error());
    }
    
    public function addUser($name, $password) {
    mysql_query("INSERT INTO `users` SET login='$name', password='$password'", $this->p) or die("Insert error : " . mysql_error());        
    }
    
    public function getUsers() {
    $seluser = mysql_query('SELECT * FROM users', $this->p) or die("Select user error" . mysql_error());
    $oneUser = mysql_fetch_array($seluser);
    return $oneUser;
    }

    public function getUserId($name, $password) {
    $queryId = mysql_query("SELECT `id` FROM `users` WHERE login = '$name' AND password='$password'") or die("Select error : " . mysql_error());
    $Id = mysql_fetch_array($queryId);
    return $Id['id'];
    }

    function __destruct() {
        mysql_close($this->p);
    }
}
?>


admin.php :
Код

<?php
include_once("dbauth.php");
ini_set("session.use_trans_sid",true);
session_start();
$sql = new db_auth;

if(isset($_POST['RegOne'])) {
    $login = addslashes($_POST['login']);
    $password = addslashes($_POST['password']);
    $password = md5($password);
    $sql->addUser($login, $password);
    header("Location: {$_SERVER['SCRIPT_NAME']}?".time());
    exit();
}

$oneUser = $sql->getUsers();
if(count($oneUser) <= 1) {
    echo "Вы должны добавить в базу хотя бы одного пользователя!";
    echo "<form action=" . $_SERVER['SCRIPT_NAME']. " method=\"post\">";
    echo "Имя : <input type=\"text\" name=\"login\"><br>";
    echo "Пароль : <input type=\"password\" name=\"password\"><br>";
    echo "<input type=\"submit\" name=\"RegOne\" value=\"Register!\">";
    echo "</form>";
    exit();
}

if(isset($_POST['exit'])) {
$_SESSION = array () ;
unset($_SESSION['PHPSESSID']);
session_unset () ;
session_destroy () ;
header("Location: {$_SERVER['SCRIPT_NAME']}?".time());
exit();
}

if((!isset($_SESSION['login'])) && (!isset($_SESSION['password']))) {
if(@$_POST['DoIt']) {
    if((!$_POST['password']) || (!$_POST['login'])) {
        header("Location: {$_SERVER['SCRIPT_NAME']}?".time());
        exit();
    }
    $login = addslashes($_POST['login']);
    $password = addslashes($_POST['password']);
    $login = trim($login, " \n\t");
    $password = trim($password, " \n\t");
    $password = md5($password);
    $Id = $sql->getUserId($login, $password);
    if($Id) {
        $_SESSION['login'] = $login;
        $_SESSION['password'] = $password;
        header("Location: {$_SERVER['SCRIPT_NAME']}?".time());
        echo "You Admin!";
    } else {
        header("Location: {$_SERVER['SCRIPT_NAME']}?".time());
        exit();
    }
}
} else {
        echo "You admin(session)!";
}
?>

<html>
<title></title>
<body>
<center><h2>Авторизация</h2></center>
<form action="<?=$_SERVER['SCRIPT_NAME']?>" method="post">
Имя : <input type="text" name="login"><br>
Пароль : <input type="password" name="password"><br>
<input type="submit" name="DoIt" value="Гоу!"><?if((isset($_SESSION['login'])) && (isset($_SESSION['password']))) echo " <input type=\"submit\" name=\"exit\" value=\"Выход!\">";?><br>
</form>
</body>
</html>

PM MAIL Jabber   Вверх
GeneralElectric
Дата 2.3.2008, 17:05 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



TimberWolf, по большому счету, в таком деле, как проверить по базе дватекстовых поля, записать в сессию, а потом проверять их наличик - серьёзно шибиться сложно.
но, если интересует критика, то какая-то у тебя автоизация многословная. очень много лишнего.
  • непонятно, почему addslashes делается не в db_auth, а в коде.
  • непонятно, зачем при авторизации $password = addslashes($_POST['password']);
  • непонятно, зачем вручную указывать символы для trim
  • непонятно, что делает регистрация в скрипте авторизации. участок RegOne висит в воздухе. да и вообще, я бы разделял авторизацию и регистрацию. Это совсем разные вещи.
  • непонятно, зачем писать в сессию логин и пароль, если они все равно никак не проверяются.
  • непонятно, почему коннект к базе происходит в классе авторизации. это единственное место в скрипте, где используется база?
  • непонятно, зачем при каждом обращении к сайту пытаться создать БД, таблицу и посчитать всех пользователей.
  • проверка if(count($oneUser) <= 1) вообще за гранью добра и зла. Получить из базы все данные на всех пользователей только для того, чтобы кому-то (неизвестно кому) сказать, чтобы добавили пользователей.
  • непонятно, что такое unset($_SESSION['PHPSESSID']);, а особенно - после $_SESSION = array () ;
  • непонятно, зачем echo "You Admin!"; после Location
  • непонятно, кто такие юзеры и что они делают в админке. админ тут, скорее всего, будет один. 
  • непонятно зачем городить классы, БД и кучу кода, чтобы обслужить его одного, когда достаточно всего лишь проверить форму и стартануть сессию
кстати, если соберешься ответить, то имей в виду. Мои "непонятно" - это не потому что я такой дурачок, и не понимаю, что значат эти куски кода. А потому, что я считаю их лишними или неправильными. Так что не торопись объяснять, а сначала задумайся - почему я так считаю.

Все die(); заменить на trigger_error();
use_trans_sid - под большим вопросом. КАК МИНИМУМ надо в этом случае делать проверку IP.
session_start(); я бы поместил после успешной проверки. ОСОБЕННО учитывая use_trans_sid



Это сообщение отредактировал(а) GeneralElectric - 2.3.2008, 17:08
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0653 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.