Technologie Gadgets, SEO Tipps, Geld Verdienen mit WEB!

Proteggi il tuo sito web con PHP Session Security M…

Proteggi il tuo sito web con PHP Session Security M...

HyperText Transfer Protocol è iniziato come protocollo senza stato. Ciò significa che ogni richiesta al server è autonoma, trasporta tutto il contesto di cui il server ha bisogno per servire la pagina web richiesta. Ogni messaggio che il client invia al server può essere elaborato da solo: il server non mantiene lo stato né le Informazioni sulla connessione.

Le applicazioni web necessitano di un modo per preservare il contesto del visitatore: dall’identità dell’utente che ha effettuato l’accesso, al carrello della spesa nei negozi di e-commerce, a dati più duraturi come la cronologia degli acquisti o la cronologia delle chat nelle applicazioni di social network.

Questo è il motivo per cui era necessario che HTTP, e tutte le applicazioni che si basavano su di esso, trovassero soluzioni per gestire questa apolidia intrinseca in HTTP. La soluzione principale sono i cookie.

PHP è forse il linguaggio di programmazione più utilizzato per il web (w3techs lo dà quasi l’80% ) e ha la propria soluzione per questo: sessioni PHP. In questo articolo descriveremo i meccanismi delle sessioni PHP, esploreremo la sicurezza delle sessioni PHP e come proteggere i cookie di sessione PHP.

Vedremo quali sono le potenziali vulnerabilità e le migliori pratiche per la sicurezza delle sessioni php.

HTTP e stato

HTTP è stato reso estensibile attraverso le sue intestazioni fin dai primi giorni. Ciò significa che è possibile aggiungere funzionalità alle richieste e alle risposte HTTP tramite intestazioni definibili dall’utente.

Le intestazioni sono campi in ogni richiesta e risposta che possono contenere vari pezzi di metadati.

I cookie sono stati pubblicati come aggiunta allo standard HTTP dall’IETF nel 1997 e da allora le specifiche hanno fatto passi avanti per essere finalmente definite RFC6265 intitolato Meccanismo di gestione dello stato HTTP .

I cookie sono definiti da IETF come un meccanismo costituito da campi di intestazione HTTP che possono essere utilizzati dai server per archiviare pezzi di dati (stato) nei client HTTP. Ciò consente al server di mantenere un contesto con stato, chiamato sessione, su più richieste HTTP.

Il browser dell’utente (il client) rinvia quindi questi cookie al server alle richieste successive, consentendo al server di ricostruire stati, come il percorso dell’acquirente, un carrello della spesa o un account di social media.

Possiamo distinguere tra cookie di sessione e cookie persistenti. I cookie di sessione sono temporanei: durano solo per la durata di quella particolare sessione del browser. Vivono nella memoria del browser. Poiché scadono quando l’istanza corrente del browser viene chiusa, non hanno una data di scadenza.

I cookie persistenti hanno una data di scadenza, sono destinati a durare per un periodo di tempo specifico.

Vengono utilizzati per aspetti quali la personalizzazione dell’esperienza dell’utente, la gestione delle sessioni, inclusi lo stato degli utenti che hanno effettuato l’accesso/disconnessione, i carrelli e per il monitoraggio del comportamento dell’utente.

I cookie solitamente memorizzano una quantità molto limitata di dati (il massimo è 4096 byte per sito web) e vengono memorizzati sui computer dei visitatori. Ciò rende i cookie limitati e insicuri, non sufficienti a soddisfare da soli le esigenze di sessione dei siti Web moderni.

Mantieni le tue app al sicuro sul cloud

DreamHost offre 2FA, SSL gratuito e funzionalità di sicurezza più avanzate su server gestiti che mantengono la tua applicazione al sicuro.

Sessioni PHP

PHP come linguaggio di programmazione web appartiene al livello dell’applicazione. PHP si basa sui cookie HTTP per fornire un meccanismo per mantenere il contesto tra più richieste. Per questo, combina l’intestazione del cookie specifica e personalizzata con la propria gestore della sessione classe:

SessionHandler implementa SessionHandlerInterface , SessionIdInterface bool public open ( string $path , stringa $nome): bool lettura pubblica (stringa $id): stringa scrittura pubblica (stringa $id, stringa $dati): bool

Questo meccanismo può essere esteso o riscritto completamente ereditando la classe SessionHandler o implementando SessionHandlerInterface.

In PHP, le sessioni vengono mantenute per impostazione predefinita come file sul server. I file portano i nomi dei rispettivi ID di sessione. Quando viene avviata la sessione, PHP imposta un cookie PHPSESSID con un ID di sessione. Successivamente, quando il browser del visitatore restituisce quel cookie ad ogni richiesta, il server lo associa ai dati della sessione nel file relativo a quella sessione. Il risultato è uno stato di sessione continuo su più pagine di un sito Web.

Utilizzo delle sessioni in PHP

Una sessione in PHP può essere avviata con una chiamata a una funzione inizio_sessione() . Questa funzione avvia una nuova sessione o ripristina una sessione esistente passata al server in un cookie o nei parametri di richiesta POST o GET. L’array superglobale $_SESSION viene quindi utilizzato per impostare o ottenere variabili in una sessione.

Se poi vogliamo Utilizzare variabili di sessione su altre pagine dello stesso sito web, un altro documento PHP deve utilizzare session_start() . Questo farà $_SESSIONE variabili, eventualmente impostate su altre pagine web/documenti, disponibili su quella corrente.

sessione_chiuso() applica le modifiche a $_SESSION sul disco

sessione_distruggi() la funzione distruggerà tutti i dati della sessione. Per rimuovere completamente la sessione, è inoltre necessario deselezionare l’ID di sessione ed eliminare esplicitamente il cookie di sessione. Oltre a queste nozioni di base, PHP ha una serie di altre funzioni per la gestione della sessione .

La funzionalità che le sessioni PHP cercano di fornire – dati persistenti durante le visite alle pagine di un sito Web – è indispensabile per i siti Web moderni. L’implementazione delle sessioni PHP, tuttavia, è un punto controverso.

Poiché i dati della sessione in PHP vengono scritti in un file sul server per impostazione predefinita e il file viene bloccato durante l’esecuzione dello script, ciò può presentare sfide in termini di prestazioni e scalabilità.

Le sessioni PHP presentano anche sfide al normale meccanismo di memorizzazione nella cache: memorizzare nella cache le pagine con il set di cookie PHPSESSID potrebbe compromettere seriamente il sito Web bypassando la cache per le pagine con PHPSESSID significherebbe bypassare la cache dell’intero sito web.

E poi ci sono problemi di sicurezza.

Problemi di sicurezza delle sessioni PHP

Le sessioni PHP rappresentano un passo avanti in termini di sicurezza rispetto a un sistema in cui tutti i dati della sessione sono archiviati nei cookie. Il cookie PHPSESSID memorizza semplicemente un ID di riferimento per un file di sessione che risiede su un server.

L’impostazione predefinita di PHP per un percorso per salvare i file di sessione, che possiamo trovare nei file di configurazione php.ini è sessione.save_path = “/tmp” . Ciò significa che i file di sessione potrebbero essere effettivamente compromessi da altri utenti.

Questo problema è particolarmente allarmante se ricordiamo che la maggior parte dei siti web basati su PHP risiedono su server condivisi con più tenant.

Il più comune di tutti gli exploit di sessione è Dirottamento della sessione.

Che cos’è un attacco di dirottamento della sessione?

Il dirottamento della sessione avviene quando un soggetto malintenzionato ottiene l’accesso illegale alla sessione di un altro utente. L’aggressore otterrà innanzitutto l’ID di sessione appartenente a un altro utente. Quindi utilizzerà questo ID per ottenere l’accesso completo alla sessione dell’altro utente. L’ID di sessione è sufficiente affinché il server dia accesso al rispettivo account.

In teoria, l’ID di sessione potrebbe essere ottenuto mediante previsione o ipotesi (forza bruta), ma il modo più probabile è che l’ID di sessione venga rubato. È molto meno probabile che si verifichino attacchi di forza bruta o previsione dell’ID.

Esistono diversi vettori attraverso i quali un utente malintenzionato può accedere all’ID sessione degli utenti.

Tipi di attacchi di dirottamento della sessione

Il dirottamento della sessione può avvenire in molti modi diversi: qui menzioniamo solo quelli più noti:

  • XSS o scripting cross-site – si tratta di un attacco che avviene quando una terza parte riesce ad iniettare javascript nel corpo di un sito web visitato dalla vittima. Diciamo che un sito web XY utilizza variabili GET e non le disinfetta adeguatamente. Un utente malintenzionato può utilizzare javascript in una richiesta GET e inserirlo nel corpo di una pagina web, ottenendo lo stesso livello di accesso del javascript del sito web. Ad esempio, può ottenere il contenuto del cookie PHPSESSID e quindi inviarlo all’aggressore.
  • Sidejacking della sessione – questo tipo di attacco avviene con il vettore di attacco Man In The Middle – in situazioni in cui l’attaccante si posiziona tra la sorgente e la destinazione del traffico. L’aggressore ascolterà richieste e risposte e, a meno che il traffico non sia crittografato, potrà acquisire l’ID di sessione.
  • Fissazione della sessione accade con le applicazioni web vulnerabili, che non insistono nell’impostare sempre un nuovo ID di sessione al momento dell’autenticazione dell’utente, ma accettano invece un ID di sessione esistente quando esiste. In questo tipo di attacco, l’aggressore creerà un ID di sessione valido ma non utilizzato e quindi, attraverso vari schemi, farà autenticare un utente valido utilizzando quell’ID. Successivamente, essendo in possesso dell’ID dell’utente autenticato, l’aggressore riesce ad accedere alla sessione dell’utente.
  • Previsione della sessione – in questo tipo di attacco, l’aggressore avrà solitamente una certa conoscenza di come l’applicazione genera gli ID di sessione e tenterà quindi di indovinare gli ID di altri utenti utilizzando lo stesso metodo. È qui che la casualità della generazione degli ID di sessione gioca un ruolo importante.

Cosa può fare un utente malintenzionato con una sessione che è stata compromessa con successo?

Una volta che un utente malintenzionato ottiene l’accesso alla sessione che appartiene a un utente legittimo, il server gli concederà tutta l’autorità di cui dispone l’utente originale. In quanto tale, l’ID sessione può essere paragonato a una chiave che garantisce al suo proprietario l’accesso alla casa, indipendentemente dal fatto che fosse o meno il proprietario della casa.

Questo attacco sarà spesso focalizzato su utenti e sessioni con accesso amministrativo, quindi in questi casi l’aggressore otterrà diritti amministrativi sul sito Web compromesso.

Best practice per la sicurezza delle sessioni PHP e importanza di PHP sessione.cookie_secure bandiera

Prima di continuare con le diverse misure che possiamo adottare per evitare che le nostre sessioni vengano sfruttate da utenti malintenzionati, è importante dire che le vulnerabilità legate alle sessioni PHP non sono qualcosa di specifico del linguaggio stesso. Non sono un difetto intrinseco di PHP: altre tecnologie richiedono misure simili per mitigare questi stessi vettori di attacco.

Quindi quali sono le misure di buon senso che possiamo adottare per mitigare gli attacchi di dirottamento della sessione?

  • Attacco XSS (Cross-Site Scripting). – la mitigazione contro questo tipo di attacco non è specifica della sessione. Il sito Web deve impedire che qualsiasi tipo di input dell’utente venga eseguito nel browser del visitatore. Ciò significa semplicemente che qualsiasi input dell’utente, tramite moduli o parametri GET o altro, deve essere disinfettato prima di essere utilizzato. Si tratta di una misura di sicurezza generale per le applicazioni web, per questo e altri tipi di attacchi (ad esempio, SQL injection). Le due funzioni principali in PHP utilizzate per pulire le stringhe sono htmlspecialchars() e strip_tags(). htmlspecialchars() converte i caratteri speciali in entità html e strip_tags() rimuoverà semplicemente tutti i tag HTML, incluso il tag