Skip to main content

Com implementar-ho?

El token s’insereix automàticament com un camp ocult en els formularis HTML, o s’envia en una capçalera HTTP si es fa servir JavaScript/AJAX.

image.png

Per fer-ho cal crear aquest token, d'aquesta tasca se n'encarrega el CodeIgniter, per això tenim dues funcions que ens generen el valor i el nom.

Configuració

Podem canviar el temps de regeneració del token, el nom del camp, etc. Dins l'arxiu app/Config/Security.php 

/**
 * --------------------------------------------------------------------------
 * CSRF Protection Method
 * --------------------------------------------------------------------------
 *
 * Protection Method for Cross Site Request Forgery protection.
 *
 * @var string 'cookie' or 'session'
 */
public string $csrfProtection = 'cookie';

/**
 * --------------------------------------------------------------------------
 * CSRF Token Randomization
 * --------------------------------------------------------------------------
 *
 * Randomize the CSRF Token for added security.
 */
public bool $tokenRandomize = false;

/**
 * --------------------------------------------------------------------------
 * CSRF Token Name
 * --------------------------------------------------------------------------
 *
 * Token name for Cross Site Request Forgery protection.
 */
public string $tokenName = 'csrf_test_name';

/**
 * --------------------------------------------------------------------------
 * CSRF Header Name
 * --------------------------------------------------------------------------
 *
 * Header name for Cross Site Request Forgery protection.
 */
public string $headerName = 'X-CSRF-TOKEN';

/**
 * --------------------------------------------------------------------------
 * CSRF Cookie Name
 * --------------------------------------------------------------------------
 *
 * Cookie name for Cross Site Request Forgery protection.
 */
public string $cookieName = 'csrf_cookie_name';

/**
 * --------------------------------------------------------------------------
 * CSRF Expires
 * --------------------------------------------------------------------------
 *
 * Expiration time for Cross Site Request Forgery protection cookie.
 *
 * Defaults to two hours (in seconds).
 */
public int $expires = 7200;

/**
 * --------------------------------------------------------------------------
 * CSRF Regenerate
 * --------------------------------------------------------------------------
 *
 * Regenerate CSRF Token on every submission.
 */
public bool $regenerate = true;

/**
 * --------------------------------------------------------------------------
 * CSRF Redirect
 * --------------------------------------------------------------------------
 *
 * Redirect to previous page with error on failure.
 *
 * @see https://codeigniter4.github.io/userguide/libraries/security.html#redirection-on-failure
 */
public bool $redirect = (ENVIRONMENT === 'production');

/**
 * --------------------------------------------------------------------------
 * CSRF SameSite
 * --------------------------------------------------------------------------
 *
 * Setting for CSRF SameSite cookie token.
 *
 * Allowed values are: None - Lax - Strict - ''.
 *
 * Defaults to `Lax` as recommended in this link:
 *
 * @see https://portswigger.net/web-security/csrf/samesite-cookies
 *
 * @deprecated `Config\Cookie` $samesite property is used.
 */
public string $samesite = 'Lax';

Com afegir Token

Creem el hidden manualment

<input type="hidden" name="<?= csrf_token() ?>" value="<?= csrf_hash() ?>" />

o li demanem que ens creï tot l'input mitjançant csrf_field()

<?= csrf_field() ?>

En cas que no s'inclogui el token CSRF si el filtre és actiu, ens apareixerà l'error:
The action you requested is not allowed.

Com ho configurem a .env

En l'arxiu .env podem configurar qualsevol dels arxius de la carpeta config, emprant la notació separada per punts, on pots posar el nom de l'arxiu i la propietat que volem modificar. Per exemple, podríem fer-ho de la forma següent:

# nom_arxiu.nom_propietat = valor
app.CSRFProtection = false
app.CSRFTokenName = 'csrf_test_name'
app.CSRFCookieName = 'csrf_cookie_name'
app.CSRFExpire = 7200
app.CSRFRegenerate = true
app.CSRFExcludeURIs = []
app.CSRFSameSite = 'Lax'