За последние 24 часа нас посетили 17640 программистов и 1592 робота. Сейчас ищут 1522 программиста ...

Конкурс: защита страниц

Тема в разделе "Решения, алгоритмы", создана пользователем artoodetoo, 4 фев 2015.

  1. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    Хочу предложить небольшой конкурс, идея возникла после прочтения одного задания на флиланс-бирже. (Работа оценивалась в $50) Думаю, сама задача довольна типичная для мелких самодельных сайтов.

    Имеется сайт из нескольких страниц. Владелец делал некоторую автоматизацию, но только сейчас ему понадобилось управлять доступом. Мы ничего не знаем о структуре и задачах сайта. Знаем только, что страницы на PHP и точек входа много, не только index.php. Каждая страница — отдельный файл.

    Надо сделать простую авторизацию чтобы владелец мог настраивать какой пользователь какие страница может открыть.
    htacces+htpasswd не вариант, надо использовать PHP, решение должно быть портируемым. Остальное на усмотрение разработчика, НО надо сделать максимально компактно и максимально просто. Требования к установке должны быть скромными. Видимо на файлах, видимо без админки, только за счет редактирования конфигурации, но опять на ваше усмотрение. Владелец имеет полный доступ к файлам, если ему объяснить что надо менять, он сумеет.

    Лучшее решение — компактное, гибкое и понятное не слишком продвинутому вебмастеру.
    Победитель зарабатывает риспект и уважуху, все читатели получают несколько полезных рецептов.
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    RBAC или ACL из фреймворка можно взять, в yii можно править конфиг и держать его в файле.
     
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.793
    Симпатии:
    1.330
    Адрес:
    Лень
    та *** авторизация на файлах как мой 2011 конструктор для игр...
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    denis01, это должно быть компактно и просто. Фреймворки не умеют так. Но ты можешь попытаться что-то извлечь ;)
     
  5. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    т.е. юзеры уже както авторизуются на сайте? юзеров можно пересчитать по пальцам? страниц тоже мало? нужно просто определять кого куда пускать?
    тогда хватит чегото такого:

    AUTH.PHP
    Код (PHP):
    1. // CONFIG: Устанавливаем пути до файлов и каталогов
    2. $rules = [ // Формат: относительный урл => Список логинов (через пробел)
    3.      '/*'         => 'user1 user2'   // все страницы и подкаталоги, от корня
    4.     ,'/test.php'  => 'runcore user2' // отдельный файл
    5.     ,'/kcaptcha/util/*'=> 'runcore'  // каталог и все подкаталоги
    6. ];
    7. // Получаем Логин пользователя
    8. $_SESSION['username'] = 'runcore'; // todo: Временная заглушка, тут получаем логин юзера!
    9. $username = isset($_SESSION['username']) ? trim($_SESSION['username']) : null;
    10. // ПРОВЕРКА ДОСТУПА ///////////////////////////////////////
    11. $path = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH );
    12. $allow = false;
    13. foreach($rules as $url=>$users) { // ищем до Первого совпадения
    14.     $isValidPath = isset($rules[$path]); // File
    15.     if ( !$isValidPath && strpos($url,'/*')!==false ) { // Dir
    16.         $url = str_replace('/*','',$url);
    17.         if ( empty($url) || strpos($path,$url)!==false ) { // Root || Inside Dir 
    18.             $isValidPath = true;
    19.         }
    20.     }
    21.     if ($isValidPath && in_array($username, explode(' ',$users)) ) {
    22.         $allow = true;
    23.         break;
    24.     }
    25. }//foreach
    26. // Запрещено ВСЁ что неразрешено!
    27. if (!$allow || empty($username) || empty($rules) ) exit('Access denied');
    28. unset($rules,$path,$username, $allow,$isValidPath); 
    и ВЕЗДЕ, во ВСЕ точки входа, вначале вставляем вызов этого скриптика
    Код (PHP):
    1. <?php
    2. include('./auth.php');
    либо прописать в auto_prepend_file

    p.s. ну если юзеров и страниц много, то решение конечно нужно делать другое. выносить настройки в файлы или в БД, и т.д.
     
  6. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Дело в том, что по стоимости разработки прикрутить ACL от знакомого фремворка много дешевле, чем что-то на коленке брать или, упаси боже, брать решения с php.ru
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    инклудить из стандартного путя инклуда, и если не авторизован или неправильно авторизован, то вылетать из пхп вообше.
    Итого надо добавить в каждый файл одну строку. А насколько я помню, в пхп есть возможность прикрутить некий стандартный скрипт который будет запускаться всегда (auto_prepend_file), и вообще не придётся ничего трогать в "сайте".
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    runcore, очень хорошо. только авторизовать придется тебе.

    Mikslr, ты включаешь в "боже упаси с php.ru" и свои собственные советы? ;) насчет знакомого фреймворка я бы согласился. только надо чтобы решение было понятно не себе любимомому, а клиенту. значит не годится.

    igordata, хорошая мысль.
     
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    Жаль соревновательности не получилось. runcore в целом обозначил простую и годную схему, респект ему и уважуха!
    Я склепаю нечто подобное, но вынесу зависимости: правила и метод авторизации, куда-нибудь наружу. Результат опубликую.
     
  10. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    да, жаль. народ отвыкает думать сам, привыкли что все уже сделано дядей, даже для элементарных задач привлекают огромные фреймворки.

    в любом случае, продолжай подобные конкурсы. может растормашим народ.

    p.s. я тут, на досуге, начал личный эксперимент. just for fun. Идея такая. попробовать реализовать микро-фреймворк, соответствующий идеологии UNIX WAY. т.е. Набор узкоспециализированных классов, реализующих четкий функционал, независимых, но легко работающих вместе. каждый из них(аналогия unix way):
    - Класс делают что-то одно и делают это хорошо.
    - Классы, которые работают(могут) вместе (но не внутри друг друга, связность минимальна либо отсутсвует).
    - Классы, имеющие некие универсальные интерфейсы конфигурации, окружения, обмена данными и т.д.

    Например: Валидатор, Кешер, Конструктор форм, Шаблонизатор, ACL... и т.д.
    внутри сайта, они будут работать как единая команда, "понимая друг друга с полуслова". Но если нужен какойто отдельный Класс-функционал, то легко берем и юзаем тоже, зависимости минимальны или отсутсвуют, а конфигурация и интерфейс обмена данными простые и единые везде.
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  12. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    Я уже ковыряю свой "минимально достаточный фреймворк": https://github.com/scrap-bin/unicycle/tree/master/src/R2
    Непростой вопрос на каком уровне достаточности можно остановиться )))
     
  13. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    ага) попробуй выдрать из него чтото. ну например нужен нам валидатор для форм, он мощный конечно, но:
    - сам валидатор это более 50 файлов на все случаи жизни (EmailAdress.php, Ip.php ...)
    - зависимость от Zend/Stdlib - это еще 30 файлов
    - сами классы по работе с Формами тоже под 50шт
    - + зависимости от Zend\InputFilter, Zend/Stdlib, Zend\ServiceManager ....

    дальше просто лень искать зависимости))

    Добавлено спустя 4 минуты 42 секунды:
    поковыряюсь на досуге.
     
  14. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    Применительно к этой теме, на моём "фреймворке" можно написать в конфиге
    Код (Text):
    1.     access_control:
    2.         - { path: ^/admin/, role: [ROLE_ADMIN, ROLE_MOD] }
    3.         - { path: ^/user/profile/, role: [ROLE_USER] }
    4.         - { path: ^/.*, role: IS_AUTHENTICATED_ANONYMOUSLY }
    и без доп. проверок в контроллерах адреса будут защищены. Но чтобы это заработало надо
    - парсер YAML
    - модель "Пользователь"
    - какой-нибудь модуль аутентификации
    - наконец метод WebApplication::checkAccess() который сделает
    Код (PHP):
    1. array_intersect($userRoles, $requiredRoles)
    в общем, в конфиге оно выглядит лаконично, а в реализации не очень.
     
  15. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    полностью от этого не уйти. можно лишь попытаться уменьшить список зависимостей. но минимум останется некая системная библиотечка, с самыми базовыми функциями.
    а вообще логично. Любая задача разбивается на мелкие подзадачи, решением которых занимаются отдельные готовые микро-инструменты.
    погоня за излишней универсальностью инструментов неизбежно приведет к увеличению зависимостей между классами и распуханием фреймворка. каждый для себя ищет золотую середину. при достижении которой можно остановится.
     
  16. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Че-то мне подсказывает что некоторые так называемые фреймворки по факту являются CMF, а другие почти отдельный язык типа Си Шарп...
    Я тут недавно очень глубоко копал в ExBB и IPB. Несмотря на весь процедурно-файловый ховнокод в ExBB, блевать тянет намного больше от IPB...А потому что куча неявных непонятных связей и IDE нифига не показывает
     
  17. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Хде композер и комментарии к коммитам? )
     
  18. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    виноват, исправлюсь

    Добавлено спустя 2 минуты 49 секунд:
    на самом деле эта песочница не импортирует никаких компонент, сталобыть компосер здесь нафиг не нужен. когда растащу на части, песочницу соответственно переделаю.

    Добавлено спустя 5 минут 49 секунд:
    Mr.M.I.T., с форумами просто беда.
    мне из того что трогал больше всего нравится fluxbb (форк старого punbb), хотя по нынешним временам он сильно устарел. зато сохранилась простота и единство стиля.
     
  19. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    А xenforo качал? Помню как его называли самым крутым форумом, потому что на зенде написан )))))
    вобщем я для себя давно вывод сделал - процедурник в едином стиле, с необходимым ООП там где это что-то дает.
     
  20. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    не на зенде, а использует зенд. классы самого форума от зендовских не наследуют. кроме зенда в комплекте идет, например, sabre dav.
     
  21. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Я говорю как это преподносилось когда он вышел...а результат известно какой. Вот ты бы выбрал его, еслиб нужно было переписать часть форума и дописать новый функционал, в т.ч. в админке? ) У меня был выбор его или IPB...
     
  22. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Не хватает раздела с особенностями ) Чем оно отличается от ларки? Или скажем из своей поделки собранной композером на основе публичных компонент? Вопрос на самом деле чисто философский, т.к. тоже писал что-то подобное. Получилось довольно не плохо, а потом пришло осознание, что все это велосипед, который нужно поддерживать вместо того что бы писать непосредственно нужный функционал.

    з.ы. композер в комплекте сам по себе фича: во-первых рано или поздно все равно придется на него перебраться, во-вторых можно сразу из коробки догружать нужные компоненты. Оно конечно можно и так, но лучше с ним ))
     
  23. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    как философ философу: "неплохо" пишется слитно. покажи своё?! было бы любопытно взглянуть на то, что ты успел сделать пока не вырос.
     
  24. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Я бы сам с удовольствием на это посмотрел, но к сожалению однажды оно в небытие. С тех пор я делаю архивы, коммиты и дампы на каждый чих ))
    Вообще, там был довольно неплохой query builder с зачатками orm`а в модельках, вполне реально позволяющий делать хитрую магию, автоматический роутинг сразу на методы контроллеров, кэширование, удобный вывод ошибок, ну и по мелочи. В целом не плохо, но сейчас бы переписал всё к чертям.
    А убила все начинания ларка: когда я раскурил её доки, то понял что это именно то к чему стремился, но гораздо веселее и логичнее. Хотя в целом не жалею, +1 к пониманию того, как оно всё работает под капотом.

    з.ы. граммар-наци! фy-фу-фу ))