[Agrega] seguridad contra ataques csrf en los formularios y lo integra en la página de registro de usuarios

This commit is contained in:
Ricardo García Jiménez 2021-09-24 18:52:41 -05:00
parent c83483a02f
commit d8494912dd
3 changed files with 53 additions and 0 deletions

View file

@ -17,10 +17,13 @@ class usersController {
// y registra un usuario por el método POST.
static public function signup() {
if (empty($_POST['signup-submit'])) {
$token = csrf::generate();
$messages = messages::get();
require_once 'views/pages/signup.php';
}
else {
csrf::validate($_POST['csrf']);
$validations = new validations(NABU_ROUTES['signup']);
$user = $validations -> validate_form($_POST, array(

View file

@ -7,6 +7,7 @@ session_start();
require_once 'core/config.php';
require_once 'libs/utils.php';
require_once 'libs/messages.php';
require_once 'libs/csrf.php';
require_once 'libs/validations.php';
$components = require 'core/routes.php';

View file

@ -0,0 +1,49 @@
<?php
defined('NABU') || exit;
class csrf {
private const size = 32;
private const hash = 'sha256';
private const secret = 'rWO!KJ9&*Wk@';
private const expiration = 4; // Horas.
// Elimina la variable de sesión.
private static function destroy() {
unset($_SESSION['csrf']);
}
private static function errors(string $error) {
self::destroy();
messages::errors($error, 400);
}
// Genera un token en base a bytes aleatorios.
public static function generate() {
$key = bin2hex(random_bytes(self::size));
$_SESSION['csrf'] = array(
'token' => hash_hmac(self::hash, self::secret, $key),
'expiration' => time() + (60 * 60 * self::expiration)
);
return $_SESSION['csrf']['token'];
}
// Valida si un token no está expirado y es igual al generado.
public static function validate($token2) {
if (empty($_SESSION['csrf'])) {
self::errors('Token inválido');
}
if (time() > $_SESSION['csrf']['expiration']) {
self::errors('El formulario ha expirado, por favor recargue la página web');
}
if (!hash_equals($_SESSION['csrf']['token'], $token2)) {
self::errors('Los tokens no coinciden');
}
self::destroy();
}
}