class Security_Csrf (Создание токенов)

Класс Security_Csrf используется для создания, управления и валидации токенов, направленных на защиту от  CSRF-атак.

/**
* CSRF Security class
* @package Security
* @uses Utils, Store_Interface , Store_Session , Request
*/

class Security_Csrf

{

// константа, имя параметра header, в котором передается токен

const HEADER_VAR = 'HTTP_X_CSRF_TOKEN';

// константа, имя параметра токена, передаваемого в POST-запросе

const POST_VAR = 'xscrftoken';

/**
* Установить хранилище токенов, реализующее интерфейс  Store_Interface
* @param Store $store
*/

static public function setStorage(Store_Interface $store)

/**
* Установить конфигурационные опции  (storage , lifetime , cleanupLimit)
* @param array $options
* @throws Exception
*/

static public function setOptions(array $options)

/**
* Создать и сохранить токен
* @return string
*/

public function createToken()

/**
* Проверить валидность токена
* @param string $token
* @return boolean
*/

public function isValidToken($token)

/**
* Удалить токены с истекшим временем жизни
*/

public function cleanup()

/**
* Удалить токен
* @param string $token
*/

public function removeToken($token)

/**
* Проверить POST-запрос на наличие токена
* @param string $tokenVar - имя параметра в запросе
* @return boolean
*/

public function checkPost($tokenVar = Security_Csrf::POST_VAR)

/**
* Проверить наличие токена в заголовках (HEADER)
* @param string $tokenVar - имя параметра в заголовке
* @return boolean
*/

public function checkHeader($tokenVar = Security_Csrf::HEADER_VAR)

}

Простой пример проверки токена:


$csrf = new Security_Csrf();
/*
 * Устанавливаем опции токена
 * lifetime — время жизни 1 час
 * cleanupLimit — лимит накопления токенов в хранилище, при котором начнется
 * очистка устаревших токенов (текущего пользователя)
 * storage — хранилище токенов, по умолчанию — сессия, оставим без изменений
 */
$csrf->setOptions(
     array(
          'lifetime' => 3600,
          'cleanupLimit' => 300
     )
);
// Проверяем наличие токена в заголовках данных POST запроса, в данном случае AJAX
if(!$csrf->checkHeader() && !$csrf->checkPost())
   Response::jsonError('Error Message');

comments powered by Disqus