Av någon konstig anledning samlar Laravel in IP-adresser och användaragenter i Session Database Table-drivrutinen.
Nästan alla sessionsdrivrutiner, förutom från databasdrivrutinen, verkar inte samla in IP-adresser.
Det enkla sättet
För att förhindra detta är det enklaste (nästan icke-kod) sättet att ändra kolumntyperna för ip-adressen och användaragenten i migreringen av sessionsdatabastabellen till boolesk istället för varchar.
Schema::create('sessions', function (Blueprint $table) { $table->string('id')->primary(); $table->foreignId('user_id')->nullable()->index();
$table->boolean('ip_address')->nullbar(); $table->boolean('user_agent')->nullable();
$table->text('nyttolast'); $table->integer('last_activity')->index(); });I det här exemplet reduceras ip-adressen och användaragenten till små heltal, vilket bara lämnar den första oktetten.
Eftersom sessionerna endast söks på id och inte på ip-adress eller användaragent verkar detta säkert. Men verifiera alltid detta själv. Om Laravel-koden någonsin skulle uppdateras för att söka på användaragent och ip-adress, kan slumpmässiga sessioner väljas, vilket kan bli en sårbarhet.
Det kan också hända att ip + användaragentdata fortfarande kommer att loggas i MySQL-loggar eller andra loggar. Så koden nedan kan vara mer robust.
Det finns andra sätt genom att skriva över/förlänga sessionsdrivrutinen:
- Skriver över en cache-drivrutin
- Laracasts fråga om en sessionsdatabastabell utan IP
- Laravel-guiden för att skriva över sessionsdrivrutiner
Kodvägen
Det ledde till kodvägen. Jag tycker att detta är det mest eleganta sättet. Du kan också skapa en anpassad drivrutin för databassession:
app/Providers/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);
});
}
}Lägg sedan till filen app\Extensions\SimpleDatabaseSessionHandler.php . Detta skriver över den extra ip-adressen och användaragentinformationen som läggs till.
<?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;
}
}Och ändra slutligen din sessionsdrivrutin i config/session.php till:
'driver' => 'databas-enkel',Du behöver inte ändra databasmigreringen på detta sätt.
Använd på egen risk såklart, testa det väl och om du upptäcker några buggar, vänligen meddela oss :).
Senast uppdaterad 21 november 2023
