• 25 PHP-разработчиков, на которых можно подписаться
    0
    Paul M. Jones — один из создателей фреймворка Aura. Его посты часто попадают на phpdeveloper.org (хотя насколько фреймворк и автор популярны в англоязычном сообществе в целом — не знаю)

    paul-m-jones.com/
    twitter.com/pmjones
    paul-m-jones.com/feed
  • Применяем делегирование совместно с наследованием для организации контроллеров действий
    0
    Можно сделать систему «сигналов» — в базовом
    class Model_Controller 
    {
    ...
        public function editAction()
        {
              if ($this->_hasEditAction()) {
                $this->_editActionHelper();
              } else {
                throw new Zend_Controller_Action_Exception('страница не найдена' , 404); 
             } 
        }
    
        protected function _hasEditAction()
        {
            return true;
        }
    ...
    }
    


    а в наследниках при необходимости переопределять _hasEditAction() для запрета или сам editAction() для совсем специфического поведения. Количество дублирования кода должно сильно уменьшиться.
  • Применяем делегирование совместно с наследованием для организации контроллеров действий
    0
    Не в основную тему поста, но так, предостережение. Если Вы блокируете в основной ветке, а снимаете блокировку только под некоторыми if'ами — можете получить проблемы.
  • Песочница для PHP
    +1
    Под пунктом 1 имелось ввиду, что при одинаковых настройках — разрешено только echo — код
    class test {
        public function method($a) 
        {
            echo $a;
        }
    }
    $test = new test();
    $test->method('in method');
    

    не пропускается, а по сути аналогичный код без скобок — пропускакется.
    class test {
        public function method($a) 
        {
             echo $a;
        }
    }
    $test = new test;
    $test->method('in method');
    

    и это как-то странно на мой взгляд.
  • Песочница для PHP
    0
    Ага, клевая идея.
    вот это пропускает:
    class Pwd extends SplFileObject
    {
        public function __construct()
        {
            $p = 'SplFileObject';
            $p::__construct('/etc/passwd');
        }
    }
    
    $pwd = new Pwd;
    $str = $pwd->fgets();
    echo $str;
    

  • Песочница для PHP
    0
    еще из возникших непоняток.

    1. пропускает вызов конструктора без параметров и скобок и дальнейшие вызовы методов созданного инстанса
    class test {
        public function method($a) {
    		echo $a;
    	}
    }
    $test = new test;
    $test->method('in method');
    
    


    2. пропускает статические вызовы через
    class test {
        public static function stat() {
    		echo 'static';
    	}
    }
    $class = 'test';
    $class::stat();


    В совокупности с наличием ООПных системных интерфейсов типа SplFileInfo указанные выше пункты кажутся потенциально опасными, хотя сходу что-то плохое не придумывается.
  • Песочница для PHP
    0
    include и require пропускаются специально?
  • Храним ID в Cookie
    0
    а она там и есть. как часть SessionData
       try {
                $encryptedContents = $this->_encrypt(
                    array(time() + $this->_keyLifetime, $contents)
                );
        } catch (Exception $exception) {
                ...
        }
        ...
        $_COOKIE[$this->_valueCookieName] = $encryptedContents;
    
  • Храним ID в Cookie
    +1
    Зануда мод он: MITM это слегка другое. Зануда мод офф.

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

    Если придумаете, как это обойти — пишите, будет интересно попробовать.
  • Храним ID в Cookie
    +1
    Теперь уже прочитанный.

    Auth_Storage_Cookie->clear() перезапишет куку на клиенте. Но сервер об этом факте забудет после окончания выполнения скрипта. Использованный _publicKey нигде не будет отмечен как «невалдиный».

    Поэтому может быть следующая последовательность событий (предположим, что session.gc_maxlifetime — 30 минут) и в конструктор не передали другой $keyLifetime.

    23:40 у меня увели куки (скопировали в «безопасное место» $_COOKIE[_k], $_COOKIE[_v]).

    23:50 я нажимаю кнопку «выход», сервер стирает $_COOKIE[_k], $_COOKIE[_v] в браузере, в котором я работал (копия, сделанная в 23:40, при этом не стирается, т.к. браузер и тем более сервер понятия не имеет где она находится); я ухожу.

    23:55 злоумышленник садится на мое место, выставляет нужные значения $_COOKIE (они у него скопированы в 23:40 и никуда не делись) и отправляет запрос на сервер с этими куками.

    Если я не ошибаюсь, сервер его пропустит и авторизует под моим аккаунтом. Если это не верно, то укажите, пожалуйста, какой метод Вашего класса заблокирует такой запрос.

    P.S. И спасибо за coding standarts — читать код удобно.
  • Храним ID в Cookie
    +1
    Разница в том, что в сессию по нажатию пользователем кнопки «выход» вы можете записать соответствующую информацию о том, что пользователь разлогинен. Эта инфа будет храниться на сервере, поэтому злоумышленник, даже уведя сессионную куку, не сможет ей воспользоваться.

    А в вашем варианте — эта инфа на сервере не хранится, поэтому кнопка «выход» не сработает.
  • Храним ID в Cookie
    0
    По-моему, в простом варианте получаем практически неотключаемую фичу «Запомнить меня».

    Т.е. можно еще в SessionData добавить время T — время создания формирования Kpub. При заходе проверять разницу между текущим временем и T при превышении какого-то предела просить перелогиниться. Но это как-то криво.

    Да, к сожалению, пока не было времени залезть в код, поэтому все замечания пишу только исходя из общей концепции, а не реализации.
  • Храним ID в Cookie
    +1
    Смотрите. Допустим, я логинюсь с чужого компьютера. Сервер формирует новый публичный ключ Kpub; шифрует мои сессионные данные на этом ключе и на секретном ключе Кpr (с привязкой к IP, если она включена), записывает две куки — Kpub; Encrypted(Kpub, Kpr, SessionData, IP). Потом я что-то делаю и выхожу.

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