- Move 12 markdown files from root to docs/ subdirectories - Organize documentation by category: • docs/troubleshooting/ (1 file) - Technical troubleshooting guides • docs/deployment/ (4 files) - Deployment and security documentation • docs/guides/ (3 files) - Feature-specific guides • docs/planning/ (4 files) - Planning and improvement proposals Root directory cleanup: - Reduced from 16 to 4 markdown files in root - Only essential project files remain: • CLAUDE.md (AI instructions) • README.md (Main project readme) • CLEANUP_PLAN.md (Current cleanup plan) • SRC_STRUCTURE_IMPROVEMENTS.md (Structure improvements) This improves: ✅ Documentation discoverability ✅ Logical organization by purpose ✅ Clean root directory ✅ Better maintainability
114 lines
3.6 KiB
PHP
114 lines
3.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Framework\Waf;
|
|
|
|
use App\Framework\Config\WafConfig;
|
|
use App\Framework\DateTime\Clock;
|
|
use App\Framework\DI\Container;
|
|
use App\Framework\DI\Initializer;
|
|
use App\Framework\Logging\Logger;
|
|
use App\Framework\Logging\ValueObjects\LogContext;
|
|
use App\Framework\Performance\PerformanceService;
|
|
use App\Framework\Waf\Layers\CommandInjectionLayer;
|
|
use App\Framework\Waf\Layers\PathTraversalLayer;
|
|
use App\Framework\Waf\Layers\SqlInjectionLayer;
|
|
use App\Framework\Waf\Layers\SuspiciousUserAgentLayer;
|
|
use App\Framework\Waf\Layers\XssLayer;
|
|
use App\Framework\Waf\MachineLearning\MachineLearningEngine;
|
|
|
|
/**
|
|
* WAF Engine Initializer
|
|
*
|
|
* Registers security layers with the WAF Engine during framework startup.
|
|
* This enables proper threat detection by configuring all available security layers.
|
|
*/
|
|
final readonly class WafEngineInitializer
|
|
{
|
|
private WafEngine $wafEngine;
|
|
|
|
private Logger $logger;
|
|
|
|
public function __construct(
|
|
private Container $container
|
|
) {
|
|
$this->wafEngine = new WafEngine(
|
|
WafConfig::development(),
|
|
$this->container->get(ThreatAssessmentService::class),
|
|
$this->container->get(PerformanceService::class),
|
|
$this->container->get(Logger::class),
|
|
$this->container->get(Clock::class),
|
|
$this->container->get(MachineLearningEngine::class)
|
|
);
|
|
$this->logger = $this->container->get(Logger::class);
|
|
}
|
|
|
|
/**
|
|
* Initialize WAF Engine with all security layers
|
|
*/
|
|
#[Initializer]
|
|
public function __invoke(): WafEngine
|
|
{
|
|
$this->logger->info('Initializing WAF Engine with security layers');
|
|
|
|
try {
|
|
// Register core security layers in priority order
|
|
$this->registerSecurityLayers();
|
|
|
|
$this->logger->info('WAF Engine initialized successfully', LogContext::withData([
|
|
'registered_layers' => $this->getRegisteredLayerNames(),
|
|
'health_status' => $this->wafEngine->getHealthStatus(),
|
|
]));
|
|
|
|
} catch (\Throwable $e) {
|
|
$this->logger->error('Failed to initialize WAF Engine', LogContext::withData([
|
|
'error' => $e->getMessage(),
|
|
'trace' => $e->getTraceAsString(),
|
|
]));
|
|
|
|
// Re-throw to prevent application startup with broken WAF
|
|
throw $e;
|
|
}
|
|
|
|
return $this->wafEngine;
|
|
}
|
|
|
|
/**
|
|
* Register all security layers with the WAF Engine
|
|
*/
|
|
private function registerSecurityLayers(): void
|
|
{
|
|
// High priority layers (processed first)
|
|
$this->wafEngine->registerLayer(new SqlInjectionLayer());
|
|
$this->wafEngine->registerLayer(new CommandInjectionLayer());
|
|
$this->wafEngine->registerLayer(new PathTraversalLayer());
|
|
|
|
// Medium priority layers
|
|
$this->wafEngine->registerLayer(new XssLayer());
|
|
|
|
// Low priority layers (processed last)
|
|
$this->wafEngine->registerLayer(new SuspiciousUserAgentLayer());
|
|
|
|
$this->logger->debug('Security layers registered', LogContext::withData([
|
|
'layers_count' => count($this->getRegisteredLayerNames()),
|
|
]));
|
|
}
|
|
|
|
/**
|
|
* Get names of registered layers for logging
|
|
* @return string[]
|
|
*/
|
|
private function getRegisteredLayerNames(): array
|
|
{
|
|
// Since WafEngine doesn't expose layer names, we'll return what we registered
|
|
return [
|
|
'sql_injection',
|
|
'command_injection',
|
|
'path_traversal',
|
|
'xss',
|
|
'suspicious_user_agent',
|
|
];
|
|
}
|
|
}
|