Session Configuration
EasyValidates session security settings and configuration.
What is Session Security?
Session configuration controls how Laravel manages user sessions. Improper configuration can lead to session hijacking, fixation attacks, and unauthorized access.
Security Impact
Severity: Medium to High
- Session hijacking
- Session fixation
- Cross-site attacks
- Unauthorized access
- CSRF vulnerabilities
How to Fix
1. Configure Secure Cookies
// config/session.php
'secure' => env('SESSION_SECURE_COOKIE', true),
'http_only' => true,
'same_site' => 'lax',
# .env
SESSION_SECURE_COOKIE=true
SESSION_DOMAIN=.yourdomain.com
SESSION_DRIVER=redis # Or database for production
2. Set Appropriate Lifetime
// config/session.php
'lifetime' => 120, // 2 hours
'expire_on_close' => false,
3. Use Database or Redis Sessions
// config/session.php
'driver' => env('SESSION_DRIVER', 'redis'),
// config/database.php
'redis' => [
'session' => [
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD'),
'port' => env('REDIS_PORT', 6379),
'database' => 1,
],
],
4. Regenerate Session on Login
// Automatically handled by Laravel, but ensure it's working:
public function login(Request $request)
{
if (Auth::attempt($credentials)) {
$request->session()->regenerate();
return redirect()->intended('dashboard');
}
}
5. Clear Session on Logout
public function logout(Request $request)
{
Auth::logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect('/');
}
Verification Steps
- Check session cookie has Secure flag
- Verify HttpOnly is set
- Test SameSite attribute
- Confirm session regenerates on login
- Verify logout clears session
Complete Configuration
// config/session.php
return [
'driver' => env('SESSION_DRIVER', 'redis'),
'lifetime' => env('SESSION_LIFETIME', 120),
'expire_on_close' => false,
'encrypt' => false,
'files' => storage_path('framework/sessions'),
'connection' => env('SESSION_CONNECTION'),
'table' => 'sessions',
'store' => env('SESSION_STORE'),
'lottery' => [2, 100],
'cookie' => env(
'SESSION_COOKIE',
Str::slug(env('APP_NAME', 'laravel'), '_').'_session'
),
'path' => '/',
'domain' => env('SESSION_DOMAIN'),
'secure' => env('SESSION_SECURE_COOKIE', true),
'http_only' => true,
'same_site' => 'lax',
];
Best Practices
- Use secure cookies in production (HTTPS)
- Set HttpOnly to prevent JavaScript access
- Use SameSite=lax or strict
- Store sessions in Redis or database
- Implement reasonable lifetime
- Regenerate on privilege elevation
- Clear on logout
- Monitor for suspicious activity
Related Issues
- CSRF Protection
- JWT Token Security
- Brute Force Protection
Automatically detect this issue
StackShield can automatically scan your Laravel application for this security issue and alert you when it's detected.
Start Free Trial