Webontwikkeling

PHP de juiste manier: Cookies

Wat zijn cookies?

Een cookie is een bestand dat door de website op een computer word opgeslagen. Dit bestand kan maximaal 4KB aan tekst bevatten. Veel al worden cookies gebruikt voor het opslaan van eenvoudige informatie zoals de gebruikersnaam of specifieke instellingen die op browser niveau onthouden dienen te worden.

Hoe veilig zijn cookies?

De veiligheid van een cookie hangt af van het doel van de cookies, maar over het al gemeen kun je cookies niet vertrouwen. De reden hiervoor is dat deze bestanden aan de cliënt kant worden opslagen en eenvoudig kunnen worden gemanipuleerd.

Wat ook heel belangrijk is dat het ten strengste afgeraden is om wachtwoorden of andere persoonlijke gegevens op te slaan in cookies, iets wat jammer genoeg vandaag de dag nog steeds voorkomt. Vaak word het wachtwoord opgeslagen in een cookie, zodat een gebruiker de volgende keer dat hij/zij de website bezoekt direct word ingelogd. Beter is om hiervoor een unieke token te gebruiken. Ook niet 100% veilig maar hiermee zorg je ervoor dat wachtwoorden afgeschermd blijven.

Hoe gebruik ik cookies?

Het gebruik van cookie binnen PHP is redelijk eenvoudig. Voor het schrijven van een cookie word er gebruik gemaakt van de functie setcookie() en voor het uitlezen via van een cookie word er gebruik gemaakt van de superglobal $_COOKIE.

Schrijven cookie

setcookie("TestCookie", "TestCookie", time()+3600, "/", ".domein.nl");

Uitlezen cookie

echo $_COOKIE["TestCookie"];

Verwijderen cookie

setcookie("TestCookie", "", time() - 3600);

Kan het efficiënter?

Ja het kan zeker efficiënter. Een ervaren programmeur is bekend met het DRY (don’t repeat yourself) principe. Waarom zou je voor elke cookie de regels opnieuw willen opgeven, waar deze vaak toch het zelfde zijn binnen een project. Om deze reden heb ik onderstaande PHP class geschreven. Tevens vereenvoudigd deze Cookie class het gebruik van acties zoals het aanmaken, updaten en verwijderen van een cookie.

/**
 * @author Jan Valkenburg @ JV-dezign.com
 * @created 2014-11-23
 *
 * Class Cookies
 */
class Cookies {

    private $expire   = 3600;
    private $path     = null;
    private $domain   = null;
    private $secure   = false;
    private $httpOnly = false;

    /**
     * @author Jan Valkenburg @ JV-dezign.com
     * @created 2014-11-23
     *
     * @param $expire
     * @param null $path
     * @param null $domain
     * @param bool $secure
     * @param bool $httpOnly
     */
    function __construct($expire = null, $path = null, $domain = null, $secure = false, $httpOnly = false) {
        $this->expire   = (int) $expire;
        $this->path     = $path;
        $this->domain   = $domain;
        $this->secure   = (bool) $secure;
        $this->httpOnly = (bool) $httpOnly;
    }

    /**
     * @author Jan Valkenburg @ JV-dezign.com
     * @created 2014-11-23
     *
     * @param $key
     * @return bool
     */
    function delete($key) {
        return setcookie($key, '', time() - 3600);
    }

    /**
     * @author Jan Valkenburg @ JV-dezign.com
     * @created 2014-11-23
     *
     * @param $key
     * @return null
     */
    function get($key) {
        return isset($_COOKIE[$key]) ? $_COOKIE[$key] : null;
    }

    /**
     * @author Jan Valkenburg @ JV-dezign.com
     * @created 2014-11-23
     *
     * @param $key
     * @param $value
     * @return bool
     */
    function set($key, $value) {
        return setcookie(
            $key, 
            $value, 
            time() + $this->expire,
            $this->path, 
            $this->domain, 
            $this->secure, 
            $this->httpOnly
        );
    }
}


$Cookies = new Cookies();
$Cookies->set('cookie', 'monster');
echo $Cookies->get('cookie');
$Cookies->delete('cookie');