[Agrega] seguridad contra ataques csrf en los formularios y lo integra en la página de registro de usuarios
This commit is contained in:
parent
c83483a02f
commit
d8494912dd
|
@ -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(
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue