Это старая версия документа!


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 автоматически, вам нужно сделать это вручную .

Печать/экспорт