Содержание
Session Handler
Фреймворк также содержит некоторые обработчики SESSION. Чтобы использовать их, просто создайте один раз новый экземпляр определенного класса. Плагины зарегистрируют новый session_set_save_handler, который синхронизирует ключи hive SESSION фреймворка с соответствующим новым классом обработчика сеанса.
Двигатели
Cache
Пространство имен: \
Расположение файла:lib/session.php
Класс Session предоставляет легкий обработчик сеанса на основе Cache .
Убедитесь, что вы включили кэш, чтобы это работало. Пример:
// just create an object new Session(); $f3->set('SESSION.test',123); echo $f3->get('SESSION.test');
Конструктор принимает несколько необязательных аргументов:
new Session( [ callable $onsuspect [, string $key [, Cache $cache ]]] )
$onsuspect необходим для отмены обработки по умолчанию подозрительных сеансов : когда измененяется IP или агент во время сессии, она прекращается и выводится код ошибки 403.
Чтобы переопределить это поведение, вы можете передать конструктору свой собственный обработчик подозрительного сеанса:
new Session(function(Session $session,$id){ // Session $id is suspect, do something // you can read $session->agent(), $session->ip(), $session->csrf() and $session->stamp() // and/or return FALSE to trigger the default 403 error });
Аргумент $key необходим для зранения CSRF токена в hive переменной:
new Session(NULL,'CSRF'); echo $f3->CSRF; // token here
$cache позволяет хранить данные сессии в специальном каталоге кэша:
$cache=Cache::instance(); // Default cache (the one defined by the CACHE variable) $sessionCache=new Cache('folder=var/sessions/'); // Session cache new Session(NULL,NULL,$sessionCache);
SQL
Этот класс предоставляет обработчик сеанса на основе SQL.
Пространство имен: \DB\SQL
Расположение файла:lib/db/sql/session.php
Предположим, у вас есть объект SQL DB в ключе hive DB, используйте:
$db = $f3->get('DB'); // just create an object new \DB\SQL\Session($db); $f3->set('SESSION.test',123); echo $f3->get('SESSION.test');
Он автоматически создаст нужную таблицу, если session таблица не существует. Имя таблицы можно контролировать с помощью 2-го параметра конструктора $table. Третий параметр $force используется для создания таблицы, если она не существует.
Mongo
Этот класс предоставляет обработчик сеанса на основе Mongo.
Пространство имен: \DB\Mongo
Расположение файла:lib/db/mongo/session.php
Предположим, у вас есть объект Mongo DB в ключе hive DB, используйте:
$db = $f3->get('DB'); // just create an object new \DB\Mongo\Session($db); $f3->set('SESSION.test',123); echo $f3->get('SESSION.test');
Имя таблицы можно контролировать с помощью 2-го параметра конструктора $table.
Jig
Этот класс предоставляет обработчик сеанса на основе JIG.
Пространство имен: \DB\Jig
Расположение файла:lib/db/jig/session.php
Предположим, у вас есть объект Jig DB в ключе hive DB, используйте:
$db = $f3->get('DB'); // just create an object new \DB\JIG\Session($db); $f3->set('SESSION.test',123); echo $f3->get('SESSION.test');
Имя таблицы можно контролировать с помощью 2-го параметра конструктора $table.
Методы
agent
Возврат HTTP user agent
string|FALSE agent( )
Возвращает user agent браузера, который использовался клиентом при создании текущего сеанса.
csrf
Вернуть токен анти-CSRF
string|FALSE csrf( )
Этот метод возвращает токен CSRF, привязанный к текущему активному сеансу и текущему запросу. Используйте этот токен для защиты вашего приложения от CSRF-атак. Конструктор классов сеанса уже выполняет некоторые проверки для предотвращения перехвата сеанса, но рекомендуется реализовать дополнительную проверку, чтобы защитить ваше приложение от атак с подменой URL и CSRF .
Вот как им пользоваться:
1)Сначала вызовите метод csrf(), чтобы получить токен текущего сеанса и сохраните его где-нибудь:
$sess=new DB\SQL\Session($db); $f3->CSRF=$sess->csrf();
NB: в качестве альтернативы вы можете создать экземпляр класса Session с 5-м параметром, для которого задано имя ключа hive, который будет содержать токен CSRF. Например:
new DB\SQL\Session($db,'sessions',TRUE,NULL,'CSRF');// now $f3->CSRF holds the token
2)Сохраните этот токен в сеансе:
$f3->copy('CSRF','SESSION.csrf');// the variable name is up to you
3)Добавьте этот токен в свою форму:
<input type="hidden" name="token" value="{{ @CSRF }}/>
4)При отправке формы сравните полученный токен со значением, хранящимся в сеансе:
$token = $f3->get('POST.token'); $csrf = $f3->get('SESSION.csrf'); if (empty($token) || empty($csrf) || $token!==$csrf) { // CSRF attack detected }
Полный пример выглядит так:
$f3->DB=new DB\SQL('mysql:host=127.0.0.1;port=3306;dbname=test;','user','p4ssw0rd'); $f3->route('GET|POST /test-csrf',function($f3,$params){ new DB\SQL\Session($f3->DB,'sessions',TRUE,NULL,'CSRF'); // or: // $sess=new DB\SQL\Session($f3->DB); // $f3->CSRF=$sess->csrf(); if ($f3->VERB=='POST') { $token = $f3->get('POST.token'); $csrf = $f3->get('SESSION.csrf'); if (empty($token) || empty($csrf) || $token!==$csrf) { echo 'CSRF attack!'; else echo 'Your name is '.$f3->get('POST.name'); die(); } $f3->copy('CSRF','SESSION.csrf'); echo '<form action="" method="post">'. '<input type="text" name="name" value="" placeholder="Your name"/>'. '<input type="hidden" name="token" value="'.$f3->CSRF.'"/>'. '<button type="submit">Submit</button></form>'; });
ip
Вернуть IP-адрес
string|FALSE ip( )
Возвращает IP-адрес, который использовался клиентом при создании текущего сеанса.
stamp
Вернуть временную метку Unix
string|FALSE stamp( )
Возвращает временную метку unix «последнее обновление в» текущего сеанса.
Events
onsuspect
Пользовательский обратный вызов для подозрительных сеансов
// Log suspicious sessions and destroy them. new \DB\SQL\Session($db,'sessions',TRUE,function($session){ // Suspect session $logger = new \Log('logs/session.log'); $f3=\Base::instance(); if (($ip=$session->ip())!=$f3->get('IP')) $logger->write('user changed IP:'.$ip); else $logger->write('user changed browser/device:'.$f3->get('AGENT')); // The default behaviour destroys the suspicious session. return false; });
Поведение по умолчанию: удаляет сеанс и выдает HTTP 403 ошибку при обнаружении подозрительного сеанса (неправильный IP-адрес или user agent). Чтобы изменить это поведение, вы можете использовать четвертый параметр конструктора для определения функции обратного вызова.
Примечание. Платформа не проверяет токен CSRF автоматически, вам нужно сделать это вручную .