Middleware - Catalogo
Catalogo completo dei middleware inclusi in HIX. Tutti seguono lo schema standard:
una funzione HIX_MwXxx( oCtx ) pronta da aggiungere alla pipeline, e nella maggior
parte dei casi una variante HIX_MwXxxFactory( params ) che ritorna un codeblock con
la propria configurazione per una route specifica.
| Legenda |
|
| Web |
Uso consigliato in applicazioni web (HTML, form, sessione) |
| API |
Uso consigliato in API (JSON, JWT, M2M) |
| Setup |
Funzione da chiamare prima di oSrv:Start() per configurare gli statici |
| Factory |
Variante che ritorna un codeblock con configurazione indipendente per route |
Tutti i middleware predefiniti di HIX sono nella cartella /src/mw
Infrastruttura
π§ HIX_MwMaintenance
|
|
| Descrizione |
ModalitΓ manutenzione gestita: blocca tutto il traffico con 503 e JSON { "error": "maintenance" } durante deploy o interruzioni pianificate. |
| Funzione |
Attivabile tramite flag programmatico o per esistenza di un lock file su disco (toggle senza riavvio). |
| Setup |
HIX_MwMaintenanceSetup( lActive, cFile ) |
| Factory |
HIX_MwMaintenanceFactory( lActive ) β solo flag, nessun lock file |
| Web |
SΓ¬ β mostra una pagina 503 amichevole |
| API |
SΓ¬ β i client devono fare retry con backoff |
| Esempio |
HIX_MwMaintenanceSetup( .F., "maintenance.lock" ) β creare il file attiva il blocco. |
π HIX_MwReqLog
|
|
| Descrizione |
Logga ogni request in ingresso con METHOD /path IP nel logger di HIX. Non blocca mai, ritorna sempre .T.. |
| Funzione |
Scrive una riga per request prima di eseguire l'handler. Livello configurabile (DEBUG/INFO/WARN). |
| Setup |
HIX_MwReqLogSetup( nLevel ) |
| Factory |
HIX_MwReqLogFactory( nLevel ) |
| Web |
SΓ¬ β utile in dev/staging |
| API |
SΓ¬ β essenziale per audit in produzione |
| Esempio |
HIX_MwReqLogSetup( HIX_LOG_INFO ) β scrive "GET /api/users 192.168.1.10". |
Sicurezza HTTP
|
|
| Descrizione |
Header HTTP di hardening su ogni risposta. Non blocca mai, arricchisce solamente. |
| Funzione |
Inietta X-Frame-Options: DENY, X-Content-Type-Options: nosniff, Strict-Transport-Security: max-age=31536000 e Content-Security-Policy. |
| Setup |
HIX_MwSecHeadersSetup( cCSP ) |
| Factory |
HIX_MwSecHeadersFactory( cCSP ) |
| Web |
Critico β includere in qualsiasi sito in produzione |
| API |
Consigliato β previene l'uso improprio delle risposte come contenuto web |
| Esempio |
HIX_MwSecHeadersSetup( "default-src 'self'; script-src 'self' 'nonce-abc'" ) |
π HIX_MwCors
|
|
| Descrizione |
Gestione CORS completa per API consumate dal browser. |
| Funzione |
Inietta header Access-Control-* su ogni risposta e risponde automaticamente con 204 al preflight OPTIONS. |
| Setup |
HIX_MwCorsSetup( cOrigin, cMethods, cHeaders ) |
| Factory |
Non applicabile |
| Web |
Opzionale β raramente necessario in same-origin |
| API |
Essenziale β qualsiasi API cross-domain o pubblica |
| Esempio |
HIX_MwCorsSetup( "https://app.com", "GET,POST,PUT", "Content-Type,Authorization" ) |
π¦ HIX_MwBodyLimit
|
|
| Descrizione |
Protegge dagli upload abusivi leggendo Content-Length prima di processare il body. |
| Funzione |
Rifiuta con 413 payload_too_large se la dimensione dichiarata supera il massimo. Default: 1 MB. |
| Setup |
HIX_MwBodyLimitSetup( nMax ) (in byte) |
| Factory |
HIX_MwBodyLimitFactory( nMax ) β limite specifico per route |
| Web |
SΓ¬ β protegge form e upload di file |
| API |
SΓ¬ β previene abusi con payload grandi |
| Esempio |
HIX_MwBodyLimitSetup( 2 * 1024 * 1024 ) β massimo 2 MB globale. |
π¦ HIX_MwRateLimit
|
|
| Descrizione |
Limitatore di frequenza delle request per IP in finestra fissa. Thread-safe con mutex. |
| Funzione |
Conta le request per IP in una finestra di N secondi. Ritorna 429 quando si supera il massimo. Espone il contatore in oCtx:hData["rate_count"]. |
| Setup |
HIX_MwRateLimitSetup( nMax, nWindowSecs ) |
| Factory |
HIX_MwRateLimitFactory( nMax, nWindowSecs ) β limite specifico per route |
| Web |
Utile su form di login/register |
| API |
Essenziale per endpoint pubblici o non autenticati |
| Esempio |
HIX_MwRateLimitSetup( 100, 60 ) β 100 req/min per IP. Per login rigido: HIX_MwRateLimitFactory( 5, 60 ). |
Sessioni
πͺ HIX_MwSession
|
|
| Descrizione |
Fondamento di qualsiasi flusso web stateful. Richiesto prima di MwAuth, MwIsAuth, MwRequireAuth e MwCsrf. |
| Funzione |
Carica la sessione dal cookie HIXSID (configurabile), la persiste secondo il backend, espone i dati in oCtx:hData["session"] e il SID in oCtx:hData["_sid"]. |
| Setup |
HIX_MwSessionSetup( cName, nTtl, nGcEvery, cStorage, cPath, cPrefix, lCrypt, cSeed, nLifeDays ) |
| Backend |
"memory" (volatile, default) o "file" (persistente su disco) |
| Apache LB |
HIX_MwSessionSetRoute( "i1" ) aggiunge suffisso al SID per stickysession=HIXSID. |
| Web |
Essenziale per qualsiasi flusso con login + cookie |
| API |
No β usa JWT invece |
| Esempio |
HIX_MwSessionSetup( "MIOSID", 3600, 60, "file", "sessions/" ) |
Autenticazione
π HIX_MwAuth
|
|
| Descrizione |
Gestisce il flusso completo di login e logout con sessione. Richiede HIX_MwSession prima. |
| Funzione |
Se la request Γ¨ POST alla route di login, legge le credenziali dal body (form o JSON), chiama il codeblock bValidate e, se valida, salva l'utente in sessione. Se Γ¨ la route di logout, distrugge la sessione. |
| Setup |
HIX_MwAuthSetup( hConfig ) con bValidate, cLoginRoute, cLogoutRoute, cUserField, cPassField, cRedirectOk, cRedirectFail, cSessionKey |
| Factory |
Non applicabile |
| Web |
SΓ¬ β pattern primario |
| API |
No β per il login in API usa JWT direttamente |
| Esempio |
HIX_MwAuthSetup( { "bValidate" => {\|u,p\| MyValidate(u,p)}, "cLoginRoute" => "/login" } ) |
πͺ HIX_MwJwt
|
|
| Descrizione |
Autenticazione stateless tramite Bearer token HS256. Ideale per API, mobile e SPA. |
| Funzione |
Estrae il token da Authorization: Bearer xxx, valida la firma HMAC-SHA256 e la scadenza (exp) e deposita il payload completo in oCtx:hData["jwt"]. Ritorna 401 se fallisce. |
| Setup |
HIX_MwJwtSetup( cKey, nExpSecs ) |
| Factory |
HIX_MwJwtFactory( cKey ) β chiave diversa per route (multi-tenant, partner) |
| Helper |
HIX_JwtEncode( hData ) genera il token al login. HIX_JwtValidate( cToken ) valida fuori dalla pipeline. |
| Web |
Opzionale β preferire MwSession con CSRF |
| API |
SΓ¬ β meccanismo stateless preferito |
| Esempio |
HIX_MwJwtSetup( "mia-chiave-segreta", 3600 ) β Authorization: Bearer eyJ... |
ποΈ HIX_MwApiKey
|
|
| Descrizione |
Autenticazione M2M tramite chiave statica. Alternativa semplice a JWT per servizi interni o partner. |
| Funzione |
Valida l'header X-Api-Key contro un hash delle chiavi consentite (lookup O(1)). Espone la chiave accettata in oCtx:hData["api_key"] per il logging a valle. |
| Setup |
HIX_MwApiKeySetup( aKeys ) |
| Factory |
HIX_MwApiKeyFactory( aKeys ) β insieme privato di chiavi per una route specifica |
| Web |
Non applicabile β gli utenti non hanno API key |
| API |
Standard per M2M e partner; combinare con MwRateLimit per anti-brute-force |
| Esempio |
HIX_MwApiKeySetup( { "svc-key-1", "partner-key-2" } ) |
Autorizzazione (guardie)
π‘οΈ HIX_MwRequireAuth
|
|
| Descrizione |
Guardia universale delle route: blocca con 401 se non c'Γ¨ un utente autenticato. Accetta sia sessione che JWT. |
| Funzione |
Cerca prima l'utente in oCtx:hData["session"] (chiave _auth_user di default). Se non c'Γ¨, prova oCtx:hData["jwt"] (fallback). Se non trova nessuno dei due, risponde con 401. Se passa, espone l'utente in oCtx:hData["user"] accessibile tramite UCurrentUser(). |
| Setup |
Non richiesto (usa la sessione configurata da MwAuthSetup) |
| Factory |
Non applicabile |
| Web |
SΓ¬ β protegge route che richiedono login (con sessione) |
| API |
SΓ¬ β protegge endpoint che richiedono JWT |
| Esempio |
Pipeline web: "HIX_MwSession,HIX_MwRequireAuth". Pipeline API: "HIX_MwJwt,HIX_MwRequireAuth". |
π€ HIX_MwIsAuth
|
|
| Descrizione |
Guardia semplice basata sulla sessione - alternativa a RequireAuth quando si lavora solo con sessioni (senza JWT). Reindirizza a /login (302) invece di rispondere con JSON 401. |
| Funzione |
Legge l'utente da oCtx:hData["session"] con la chiave configurata (default _auth_user). Se non esiste, reindirizza all'URL di redirect_login (configurabile in config.json sezione auth). |
| Setup |
Tramite config.json: sezione auth β session_user_key, redirect_login |
| Factory |
Non applicabile |
| Web |
SΓ¬ β preferibile quando si vuole il redirect invece di JSON 401 |
| API |
No β usa RequireAuth |
| Esempio |
o:Add( UMiddleware():New( "HIX_MwIsAuth" ) ) dopo HIX_MwSession. |
π HIX_MwHasRole
|
|
| Descrizione |
Guardia di ruolo e operazioni granulari. Legge il ruolo richiesto dal cScope della route. Deve venire dopo un middleware che ha caricato l'utente (MwIsAuth o MwRequireAuth). |
| Funzione |
Compara oCtx:cScope (formato "role" o "role:operazione") contro l'hash dei ruoli dell'utente. Accesso completo se il valore del ruolo Γ¨ vuoto; granulare se elenca operazioni separate da ;. Risponde con 403 se fallisce. |
| Setup |
Tramite config.json: sezione auth β roles_key (default "roles") |
| Factory |
Non applicabile β la differenza tra route si fa con il parametro cScope della route |
| Web |
Sì |
| API |
Sì |
| Esempio |
oSrv:AddRouteGet( "del", "/users/:id", action, "MyAuth", "admin:delete" ) β richiede il ruolo admin con operazione delete. |
π― HIX_MwJwtScope
|
|
| Descrizione |
Guardia di scope per JWT (stile OAuth 2.0). Legge lo scope richiesto dal cScope della route e lo confronta con il claim scope del token. |
| Funzione |
Se cScope Γ¨ vuoto, passa. Altrimenti verifica che ogni token (separato da spazio) in cScope sia presente nel claim scope del JWT. Risponde con 403 se ne manca qualcuno. |
| Setup |
Non richiesto |
| Factory |
Non applicabile |
| Web |
Non comune |
| API |
SΓ¬ β controllo scope in API JWT |
| Esempio |
Token con "scope" => "read:products write:orders". Route "read:products" β passa. Route "delete:products" β 403. |
CSRF
π HIX_MwCsrf
|
|
| Descrizione |
Protezione CSRF basata sulla sessione. Genera un token casuale per sessione e lo valida sui metodi non sicuri (POST/PUT/DELETE/PATCH). Richiede HIX_MwSession prima. |
| Funzione |
Su metodi GET/HEAD/OPTIONS, genera il token se non esiste e lo espone come oCtx:hData["csrf_token"] (da incorporare nei form). Su metodi non sicuri, lo legge dall'header X-CSRF-Token o dal campo form _csrf e lo confronta con quello in sessione. Ritorna 403 se non corrisponde. |
| Setup |
HIX_MwCsrfSetup( cRedirect, cHeader, cField, cSecret, nLapsus ) |
| Factory |
Non applicabile |
| Web |
Essenziale β includere sempre in web con sessione e form |
| API |
Non applicabile β usa JWT (non inviato automaticamente dal browser) |
| Esempio |
Il template incorpora {{ oCtx:hData["csrf_token"] }} in <input name="_csrf">. POST senza token β 403. |
π HIX_MwCsrfCheck
|
|
| Descrizione |
Variante stateless di CSRF basata su HMAC. Valida token firmati senza bisogno di una sessione. |
| Funzione |
I metodi sicuri (GET/HEAD/OPTIONS) passano. Su metodi non sicuri, legge il token dall'header o dal campo e verifica la firma HMAC con la chiave dell'applicazione. Non richiede una sessione. |
| Setup |
Condivide la chiave HMAC e la configurazione con MwCsrf |
| Factory |
Non applicabile |
| Web |
SΓ¬ β alternativa a MwCsrf quando non si vuole mantenere lo stato in sessione |
| API |
Non comune |
| Esempio |
oSrv:AddRoutePost( "auth", "/auth", "controllers/auth.prg", "HIX_MwCsrfCheck" ) con token generato da @csrf / UCsrfToHtml() nel form. |
Riepilogo rapido per scenario
| Scenario |
Stack tipico |
| Web statico pubblico |
HIX_MwReqLog, HIX_MwSecHeaders, HIX_MwBodyLimit |
| Web con login + sessione |
+ HIX_MwSession, HIX_MwCsrf, HIX_MwAuth, HIX_MwRequireAuth (o HIX_MwIsAuth) |
| Web con ruoli |
+ HIX_MwHasRole (dichiara cScope sulla route) |
| API pubblica |
HIX_MwReqLog, HIX_MwSecHeaders, HIX_MwCors, HIX_MwRateLimit, HIX_MwBodyLimit |
| API autenticata (JWT) |
+ HIX_MwJwt, HIX_MwRequireAuth, HIX_MwJwtScope |
| API M2M / partner |
+ HIX_MwApiKey, HIX_MwRequireAuth |
| ModalitΓ deploy/outage |
HIX_MwMaintenance globale (all'inizio della pipeline) |