CSRF protection

Omdat we nu een url hebben waar posts kunnen worden toegevoegd en verwijderd zou hier van buiten onze website misbruik van kunnen worden gemaakt. Het is vrij eenvoudig om een scriptje te schrijven dat duizenden posts via onze /post-create gaan toevoegen. Uiteraard is dit onwenselijk en willen we dat het alleen mogelijk is om posts toe te voegen via onze website. Dit kan door gebruik te maken van csrf protectie.

Bij CSRF protectie wordt er bij elk formulier op de website een code toegevoegd. Deze code is op de server bekend. Als deze twee codes overeenkomen dan kan het formulier worden verwerkt. Zo niet dan zal deze worden geweigerd met bijvoorbeeld een foutmelding. Alleen bij formulieren met een method="post" zal de protectie woren uitgevoerd

Toen we de toast/flash bar hadden toegevoegd hebben we ook meteen wat andere functies toegevoegd csrf() en validateToken().

Installeren

Voeg het bestand src/csrf.php toe.

Voeg het bestand src/views/401.view.php toe.

Voeg een require toe aan index.php

<?php
session_start();

//inladen van de configuratie parameters
$config = require __DIR__ . "/../app/config.php";

//handige functies
require __DIR__ . "/../src/functions.php";

//Database class
require __DIR__ . "/../src/Database.php";

//csrf protection
require __DIR__."/../src/csrf.php";

//routes
require __DIR__ . "/../app/router.php";

De installatie is nu klaar

Gebruik van CSRF tokens

Aan elk formulier moet nu een csrf token worden toegevoegd om het te laten werken. Probeer nu maar eens een post te verwijderen. Als het goed is krijg je de boodschap:

401 Geen toegang: CSRF-token mismatch error.

Om het weer te laten werken voegen we aan ons verwijder formulier de volgende regel toe

<?= csrf() ?>

De code voor de volledige verwijder button wordt dan:

<form method="post" action="/post-destroy">
  <?= csrf() ?>
  <input type="hidden" name="id" value="<?= $post['id'] ?>">
  <input type="submit" value="Verwijder" name="delete" class="border border-1 rounded-md px-2 py-1 hover:bg-gray-100 cursor-pointer">
</form>

Daarmee werkt onze verwijder button weer. En is het niet meer mogelijk om met externe scripts posts te verwijderen.
Als je F12 klikt en dan klikt op tabblad netwerk en dan een post verwijderd. Dan kun je bij de aanvraag zien wat er wordt meegestuurd. En dat is een flink lange _token.

Voeg de <?= csrf() ?> nu ook toe aan views/post-create.view.php, zodat deze ook weer werkt.

 

Als je meer wilt weten over csrf protectie kan je dat  hier lezen.