Tabla de sesiones sin dirección IP

Tabla de sesiones de base de datos de Laravel sin dirección IP ni recopilación de agente de usuario (compatible con GDPR)

Por alguna extraña razón, Laravel recopila direcciones IP y agentes de usuario en el controlador de la tabla de base de datos de sesión.

Casi todos los controladores de sesión, excepto el controlador de base de datos, no parecen recopilar direcciones IP.

La manera sencilla

Para evitar esto en la mayoría de los casos, la forma más fácil (casi sin código) es cambiar los tipos de columnas de la dirección IP y del agente de usuario en la migración de la tabla de base de datos de sesiones a booleano en lugar de varchar.

Esquema::create('sesiones', función (Blueprint $table) { $table->string('id')->primary(); $table->foreignId('user_id')->nullable()->index();
    $table->boolean('dirección_ip')->anulable(); $table->boolean('agente_usuario')->anulable();
    $table->text('carga útil'); $table->integer('última_actividad')->índice(); });

En este ejemplo, la dirección IP y el agente de usuario se reducen a números enteros diminutos, dejando solo el primer octeto.

Dado que las sesiones solo se buscan por ID y no por dirección IP o agente de usuario, esto parece seguro. Pero siempre verifique esto usted mismo. Si el código de Laravel se actualizara alguna vez para buscar por agente de usuario y dirección IP, se podrían seleccionar sesiones aleatorias, lo que podría convertirse en una vulnerabilidad.

También podría suceder que los datos de IP + agente de usuario se registren en los registros de MySQL o en otros registros. Por lo tanto, el código que se muestra a continuación podría ser más sólido.

Existen otras formas de sobrescribir/extender el controlador de sesión:

🤓😎 Cada vez más personas reciben nuestros consejos sobre Geek, Privacidad, Desarrollo y Estilo de Vida.

¿Quieres recibir las últimas novedades de los blogs sobre tecnología, privacidad, desarrollo y estilo de vida? Suscríbete a nuestro boletín.

El camino del código

Eso me llevó a la forma de usar el código. Creo que es la forma más elegante. También puedes crear un controlador de sesión de base de datos personalizado:

aplicación/Proveedores/AppServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Pagination\Paginator;
use Illuminate\Support\ServiceProvider;

// Session part
use App\Extensions\SimpleDatabaseSessionHandler;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Support\Facades\Session;
use Illuminate\Database\ConnectionInterface;

class AppServiceProvider extends ServiceProvider
{


    /**
     * Register any application services.
     */
    public function register(): void
    {
           //
    }
 
    /**
     * Bootstrap any application services.
     */
    public function boot(ConnectionInterface $connection): void
    {

        Session::extend('database-simple', function (Application $app) use ($connection) {
            $table   = \Config::get('session.table');
            $minutes = \Config::get('session.lifetime');
            return new SimpleDatabaseSessionHandler($connection, $table, $minutes);
        });
           

    }

}

Luego, agregue el archivo app\Extensions\SimpleDatabaseSessionHandler.php. Esto sobrescribe la dirección IP adicional y la información del agente de usuario que se agrega.

<?php
 
namespace App\Extensions;

use Illuminate\Session\DatabaseSessionHandler;
 
class SimpleDatabaseSessionHandler extends DatabaseSessionHandler
{
    /**
     * Add the request information to the session payload.
     *
     * @param  array  $payload
     * @return $this
     */
    protected function addRequestInformation(&$payload)
    {
        return $this;
    }
}

Y finalmente cambia tu controlador de sesión en config/session.php a:

'controlador' => 'base de datos-simple',

No es necesario cambiar la migración de la base de datos de esta manera.

Úselo bajo su propio riesgo, por supuesto, pruébelo bien y si detecta algún error, háganoslo saber :).

Última actualización: 21 de noviembre de 2023

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

es_ESEspañol
Ir arriba