Использование Cookie с шифрованием через промежуточное ПО



Проверка и отправка Cookie

Использование Куков в CakePHP 3 - довольно простая процедура. В первую очередь в каком либо контроллере создадим переменную с произвольным значением, которое мы будем отправлять в браузер пользователя. Далее выполним проверку на уже существование куки по названием, например, User, и если такой куки в браузере не существует, то отправляем ее в ответе сервера:

if(!$this->request->getCookie('User')) { //проверка существования куки User
            $value_cookie = "123456";
            //добавляем в ответ сервера куку User с указанием значения и настроек
            $this->response = $this->response->withCookie('User', [
                'value' => $value_cookie, // значение куки
                'path' => '/', // Путь на сервере, по умолчанию является базовый путь приложения
                'httpOnly' => false, // если true, то кука будет доступна только через http
                'secure' => false, //если true, то кука будет передаваться только через защищенное соединение
                'expire' => strtotime('+1 day') //время существования куки
            ]);
        }

Помните, что куки отправляться только в том случае, если экшен контроллера завершен. А если вы, например во время отладки, выводите какую либо информацию в своем контроллере при помощи debug(), то куки не будут отправлены.

После того, как вы обновите страницу, то с помощью инструментов разработчика в браузере можно обнаружить куку под именем User и значением 123456.

Подключение промежуточного ПО для шифрования файлов cookie

Если в вашем приложении файлы cookie относятся к данным, которые вы хотите обфусцировать, чтобы защитить от вмешательства пользователя, то используйте шифрующее промежуточное ПО CakePHP (Cake\Http\Middleware\EncryptedCookieMiddleware) для шифрования и дешифрования этих файлов. Подключать указанное ПО можно непосредственно в контроллере, в котором происходит работа с куками, которые необходимо защитить. В примере подключение мы выполним для всего приложения в файле src\Application.php, который будет выглядеть следующим образом:

<?php

namespace App;

use Cake\Core\Configure;
use Cake\Error\Middleware\ErrorHandlerMiddleware;
use Cake\Http\BaseApplication;
use Cake\Routing\Middleware\AssetMiddleware;
use Cake\Routing\Middleware\RoutingMiddleware;
use Cake\Http\Middleware\EncryptedCookieMiddleware; // Добавлено 1

class Application extends BaseApplication
{
    public function bootstrap()
    {
        parent::bootstrap();
    }

    public function middleware($middlewareQueue)
    {
        $cookies = new EncryptedCookieMiddleware(
            // Имена файлов cookie, которые нужно защитить
            ['User'],
            Configure::read('Security.cookieKey') // ключ для шифрования и дешифрования файлов cookie
        );// Добавлено 2

        $middlewareQueue
            ->add(ErrorHandlerMiddleware::class)
            ->add(AssetMiddleware::class)
            ->add(new RoutingMiddleware($this, '_cake_routes_'))
            ->add($cookies);// Добавлено 3

        return $middlewareQueue;
    }
}

Ну и на конец не забываем указать в конфигурационном файле своего приложения ключ шифрования cookieKey. А именно, это элемент Security в массиве файла app.php:

'Security' => [
        'salt' => env('SECURITY_SALT', '5961020f5166059c91a54b7d80733dde53810177f683a3e8a3406fe5c49e628a'),
        'cookieKey' => '503b76b2b6b1db93a090b7139669e162' // придумайте и пропишите здесь свой ключ
    ],

Рекомендуется, чтобы ключ шифрования, который вы используете для данных cookie, использовался исключительно для данных cookie

Теперь, перед обновлением страницы, удалите из браузера сохраненную ранее куку User, иначе CakePHP выкинет ошибку (так как имеющаяся в нем кука была сохранена без ключа). Далее, после обновления страницы, с помощью инструментов разработчика в браузере можно обнаружить куку под именем User и зашифрованным значением, что-то вроде Q2FrZQ%3D%3D.N2M5NGM5MTA5M2RiN2I3..... Однако, в вашем контроллере при обращении к куке, полученной из браузера в запросе, вы получите именно ее значение 123456:

$user_cookie = $this->request->getCookie('User')// поместит в переменную значение 123456

Дополнительную информацию про отправку и получение файлов Cookie смотрите на официальном сайте кейка, на сегодняшний день там эти разделы уже русифицированы.