Pour une raison étrange, Laravel collecte les adresses IP et les agents utilisateurs dans le pilote de table de base de données de session.
Presque tous les pilotes de session, à l'exception du pilote de base de données, ne semblent pas collecter d'adresses IP.
La méthode simple
Pour éviter cela, le moyen le plus simple (presque sans code) est de modifier les types de colonnes de l'adresse IP et de l'agent utilisateur dans la migration de la table de base de données des sessions en booléen au lieu de varchar.
Schéma::create('sessions', fonction (Blueprint $table) { $table->string('id')->primary(); $table->foreignId('user_id')->nullable()->index();
$table->boolean('adresse_ip')->nullable(); $table->boolean('agent_utilisateur')->nullable();
$table->text('charge utile'); $table->integer('dernière_activité')->index(); });Dans cet exemple, l'adresse IP et l'agent utilisateur sont réduits à de minuscules entiers, ne laissant que le premier octet.
Étant donné que les sessions ne sont recherchées que sur l'identifiant et non sur l'adresse IP ou l'agent utilisateur, cela semble sûr. Mais vérifiez toujours cela vous-même. Si le code Laravel devait être mis à jour pour rechercher sur l'agent utilisateur et l'adresse IP, des sessions aléatoires pourraient être sélectionnées, ce qui pourrait devenir une vulnérabilité.
Il peut également arriver que les données IP + agent utilisateur soient toujours enregistrées dans les journaux MySQL ou d'autres journaux. Le code ci-dessous pourrait donc être plus robuste.
Il existe d'autres moyens d'écraser/d'étendre le pilote de session :
- Écraser un pilote de cache
- Question de Laracasts sur une table de base de données de session sans IP
- Le guide Laravel pour écraser les pilotes de session
La voie du code
Cela a conduit à la méthode du code. Je pense que c'est la méthode la plus élégante. Vous pouvez également créer un pilote de session de base de données personnalisé :
app/Fournisseurs/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);
});
}
}Ajoutez ensuite le fichier app\Extensions\SimpleDatabaseSessionHandler.php . Cela remplace l'adresse IP supplémentaire et les informations de l'agent utilisateur ajoutées.
<?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;
}
}Et enfin, changez votre pilote de session dans config/session.php en :
'driver' => 'base de données simple',Vous n’avez pas besoin de modifier la migration de la base de données de cette manière.
Utilisez-le à vos propres risques bien sûr, testez-le bien et si vous repérez des bugs, faites-le nous savoir :).
Dernière mise à jour le 21 novembre 2023
