This document outlines the complete implementation of the Console Security module that adds runtime protection to the existing vulnerability scanner package.
What we're adding:
console:strict middleware for route protection[@afConsoleSecurity](https://github.com/afConsoleSecurity) Blade directive for easy integrationUser experience:
[@afConsoleSecurity](https://github.com/afConsoleSecurity) to layout headconsole:strict middleware on protected routessrc/Http/Middleware/ConsoleStrictMiddleware.php (250 lines)
src/Http/Controllers/HandshakeController.php (180 lines)
verify() - Initial handshakerenew() - Token auto-renewalstatus() - Check token validitysrc/Support/SecurityToken.php (200 lines)
config/console-security.php (120 lines)
resources/views/loader.blade.php (80 lines)
resources/views/blocked.blade.php (100 lines)
resources/js/console-security.js (350 lines)
src/Support/BladeDirectives.php (60 lines)
[@afConsoleSecurity](https://github.com/afConsoleSecurity) directivesrc/Traits/WithConsoleSecurity.php (120 lines)
use trait integrationsrc/Http/Middleware/LivewireSecurityMiddleware.php (150 lines)
src/Http/Middleware/ContentSecurityPolicyMiddleware.php (100 lines)
src/Services/AIDetectionService.php (200 lines)
routes/console-security.php (New file, 30 lines)
src/LaravelSecurityServiceProvider.php (Update existing)
โ Day 1-2:
โ Day 3-4:
โ Day 5:
โณ Day 6-7:
Problem: CSRF tokens expire, causing 419 errors
Solution: Auto-renewal before expiration
// In console-security.js
setInterval(async () => {
if (tokenExpiresIn() < 60) { // Less than 1 minute left
await renewToken();
}
}, 30000); // Check every 30 seconds
Multi-layered approach (all must agree for accuracy):
function detectDevTools() {
let detected = false;
// Method 1: Size difference
const widthDiff = window.outerWidth - window.innerWidth;
const heightDiff = window.outerHeight - window.innerHeight;
if (widthDiff > 160 || heightDiff > 160) detected = true;
// Method 2: Console toString trick
let consoleOpened = false;
console.log('%c', {toString: () => (consoleOpened = true, '')});
if (consoleOpened) detected = true;
// Method 3: Loop timing
const start = performance.now();
for (let i = 0; i < 100000; i++) {}
const elapsed = performance.now() - start;
if (elapsed > 120) detected = true;
return detected;
}
Why? Prevents cookie theft attacks
// In HandshakeController
$token = (string) Str::uuid();
$request->session()->put('_security_token', $token);
$encrypted = encrypt($token);
return response()->json(['ok' => true])
->cookie(
config('console-security.cookie.name'),
$encrypted,
config('console-security.cookie.lifetime')
);
Flow:
Automatic with trait:
use WithConsoleSecurity;
// Trait automatically:
// 1. Adds token to every Livewire request
// 2. Validates token on server
// 3. Renews token when needed
// 4. Blocks tampering attempts
// config/console-security.php
return [
'enabled' => env('CONSOLE_SECURITY_ENABLED', true),
'cookie' => [
'name' => 'af_handshake',
'lifetime' => 5, // minutes
],
'token' => [
'auto_renew' => true,
'rotation_interval' => 240, // 4 minutes
],
'excluded_paths' => [
'_security/*',
'api/*',
'assets/*',
],
'whitelist' => [
'ips' => ['127.0.0.1'],
],
];
/blocked# 1. Install package
composer require artflow-studio/laravel-security
# 2. Publish config
php artisan vendor:publish --tag=console-security-config
# 3. Publish views (optional)
php artisan vendor:publish --tag=console-security-views
# 4. Add to layout
# In resources/views/layouts/app.blade.php:
<head>
[@afConsoleSecurity](https://github.com/afConsoleSecurity)
</head>
# 5. Protect routes
Route::middleware(['console:strict'])->group(function () {
Route::get('/admin', [AdminController::class, 'index']);
Route::get('/dashboard', [DashboardController::class, 'index']);
});
# 6. Livewire components (optional)
use ArtflowStudio\LaravelSecurity\Traits\WithConsoleSecurity;
class MyComponent extends Component
{
use WithConsoleSecurity;
}
That's it! 3 steps for basic protection.
Total: Negligible impact (<1% for most apps)
Ready to start implementing! ๐
Begin with creating the middleware and controller files as outlined in PLAN.md Phase 1.
How can I help you explore Laravel packages today?