Cookies Management

Cookies are a very useful way to store small pieces of data on the client’s machine that can be retrieved even if the user closes his/her browser. Phalcon\Http\Response\Cookies acts as a global bag for cookies. Cookies are stored in this bag during the request execution and are sent automatically at the end of the request.

Basic Usage

You can set/get cookies by just accessing the cookies service in any part of the application where services can be accessed:

<?phpusePhalcon\Mvc\Controller;classSessionControllerextendsController{publicfunctionloginAction(){// Check if the cookie has previously setif($this->cookies->has('remember-me')){// Get the cookie$rememberMeCookie=$this->cookies->get('remember-me');// Get the cookie's value$value=$rememberMeCookie->getValue();}}publicfunctionstartAction(){$this->cookies->set('remember-me','some value',time()+15*86400);$this->cookies->send();}publicfunctionlogoutAction(){$rememberMeCookie=$this->cookies->get('remember-me');// Delete the cookie$rememberMeCookie->delete();}}

Encryption/Decryption of Cookies

By default, cookies are automatically encrypted before being sent to the client and are decrypted when retrieved from the user. This protection prevents unauthorized users to see the cookies’ contents in the client (browser). Despite this protection, sensitive data should not be stored in cookies.

If you wish to use encryption, a global key must be set in the crypt service:

<?phpusePhalcon\Crypt;$di->set('crypt',function(){$crypt=newCrypt();/**
* Set the cipher algorithm.
*
* The `aes-256-gcm' is the preferable cipher, but it is not usable until the
* openssl library is upgraded, which is available in PHP 7.1.
*
* The `aes-256-ctr' is arguably the best choice for cipher
* algorithm in these days.
*/$crypt->setCipher('aes-256-ctr');/**
* Setting the encryption key.
*
* The key should have been previously generated in a cryptographically safe way.
*
* Bad key:
* "le password"
*
* Better (but still unsafe):
* "#1dj8$=dp?.ak//j1V$~%*0X"
*
* Good key:
* "T4\xb1\x8d\xa9\x98\x054t7w!z%C*F-Jk\x98\x05\x5c"
*
* Use your own key. Do not copy and paste this example key.
*/$key="T4\xb1\x8d\xa9\x98\x054t7w!z%C*F-Jk\x98\x05\x5c";$crypt->setKey($key);return$crypt;});

Sending cookies data without encryption to clients including complex objects structures, resultsets, service information, etc. could expose internal application details that could be used by an attacker to attack the application. If you do not want to use encryption, we highly recommend you only send very basic cookie data like numbers or small string literals.