diff --git a/security/cgi-bin.xml b/security/cgi-bin.xml
new file mode 100644
index 000000000..3eb6d0108
--- /dev/null
+++ b/security/cgi-bin.xml
@@ -0,0 +1,264 @@
+
+
+
+
+
+
+
+ PHP installato come binario CGI
+
+
+ Possibili attacchi
+
+ Usare di PHP come binario CGI è un'opzione che
+ permette di evitare di integrarlo come modulo del server
+ (come Apache) oppure per utilizzarlo con diversi tipi di wrapper CGI
+ o per creare con chroot e setuid
+ ambienti sicuri per gli script. Questa configurazione di solito prevede
+ l'installazione dell'eseguibile php nella directory
+ del server web cgi-bin.
+ L'informativa CERT CA-96.11 sconsiglia
+ di posizionare interpreti in cgi-bin.
+ Invece il binario php può essere utilizzato in modo autonomo,
+ PHP è progettato per prevenire gli attacchi possibili in questa configurazione:
+
+
+
+
+ Accesso al file system: http://my.host/cgi-bin/php?/etc/passwd
+
+
+ Le informazioni contenute nell'URL dopo il punto interogativa (?)
+ vengono passate come argomenti dalla riga di comando all'interprete tramite interfaccia CGI. Di solito
+ gli interpreti aprono ed eseguono il file specificato nel primo
+ argomento della riga di comando.
+
+
+ Quando PHP viene invocato come binario CGI, php
+ non interpreta gli argomenti della riga di comando.
+
+
+
+
+
+ Accesso a qualsiasi documento web sul server:http://my.host/cgi-bin/php/secret/doc.html
+
+
+ Le informazioni sull'URL dopo il nome del binario PHP,
+ /secret/doc.html sono
+ convenzionalmente usate per specificare il nome dello script da
+ aprire e da interpretare dal programma CGI.
+ Solitamente alcune direttive nella configurazione del server web (Apache:
+ Action) sono usate per reindirizzare le richieste di
+ documenti come http://my.host/secret/script.php all'interprete PHP.
+ Con questa configurazione, il server web prima controlla i permessi
+ di accesso alla directory /secret,
+ e poi crea la richiesta che viene reindirizzata a http://my.host/cgi-bin/php/secret/script.php.
+ Purtroppo, se la richiesta è fatta originariamente in questo modo,
+ il server web non esegue alcun controllo di accesso al file /secret/script.php, ma solo per il file
+ /cgi-bin/php. In questo modo
+ qualsiasi utente che è in grado di accedere a /cgi-bin/php è in grado di accedere a qualsiasi
+ documento protetto sul server web.
+
+
+ In PHP, le direttive di configurazione a runtime cgi.force_redirect, doc_root e user_dir possono essere utilizzate per prevenire
+ questo tipo di attacco, se la struttura dei documenti del server ha directory
+ con restrizioni di accesso. Vedere qui di seguito per un completo chiarimento
+ delle diverse combinazioni.
+
+
+
+
+
+
+ 1° Caso: solo files pubblici elaborati
+
+
+ Se il server non ha alcun contenuto che non è protetto
+ da password o un controllo d'accesso basato su IP, non c'è bisogno di
+ usare questa configurazione. Se il server web non consente di
+ effettuare reindirizzamenti, o non c'è un modo per
+ comunicare all'eseguibile di PHP che la richiesta è una
+ richiesta di reindirizzamento sicuro, è possibile abilitare la
+ direttiva cgi.force_redirect.ini.
+ Bisogna comunque assicurarsi che gli script PHP
+ non usino nè l'uno o l'altro modo di chiamare lo script,
+ né direttamente http://my.host/cgi-bin/php/dir/script.php
+ né indirettamente http://my.host/dir/script.php.
+
+
+ Il reindirizzamento può essere configurato in Apache utilizzando AddHandler e la direttiva
+ Action (vedi sotto).
+
+
+
+
+ 2° Caso: utilizzo di cgi.force_redirect
+
+ La configurazione della direttiva cgi.force_redirect
+ impedisce a chiunque di chiamare direttamente php
+ tramite URL http://my.host/cgi-bin/php/secretdir/script.php.
+ Invece, PHP funzionerà in questa modalità solo se la richiesta viene fatta
+ passare attraverso le regole di reindirizzamento del server web.
+
+
+ Solitamente il reindirizzamento nella configurazione di Apache
+ viene eseguito con le seguenti direttive:
+
+
+
+
+
+ Questa opzione è stata testata solo con il server web Apache
+ e si basa su Apache per impostare la variabile di ambiente
+ CGI non standard REDIRECT_STATUS sulle richieste
+ reindirizzate. Se il server web non supporta alcun modo per
+ stabilire se la richiesta è diretta o reindirizzata, non è
+ possibile utilizzare questa opzione e si deve utilizzare uno
+ degli altri modi per eseguire la versione CGI documentata
+ qui.
+
+
+
+
+ 3° Caso: impostare doc_root o user_dir
+
+ Includere contenuti attivi, come script ed eseguibili, nelle
+ directory dei documenti del server Web è talvolta considerato
+ una pratica non sicura. Se, a causa di un errore di configurazione,
+ gli script non vengono eseguiti ma visualizzati come normali documenti HTML,
+ ciò può causare la perdita di proprietà intellettuale o far visualizzare informazioni di
+ sicurezza come le password. Pertanto, molti amministratori di sistema
+ preferiranno impostare un'altra struttura di directory per gli script
+ accessibili solo tramite PHP CGI e quindi saranno sempre interpretati e
+ non visualizzati come tali.
+
+
+ Inoltre, se il metodo per verificare che le richieste non vengano
+ reindirizzate, come descritto nella sezione precedente, non è disponibile,
+ è necessario impostare il doc_root degli script
+ diverso dalla radice dei documenti Web.
+
+
+ Puoi impostare la directory per gli script di PHP tramite la direttiva di configurazione
+ doc_root nel
+ file di configurazione, oppure
+ puoi impostare la variabile d'ambiente
+ PHP_DOCUMENT_ROOT. Se è stata configurata, la versione CGI
+ di PHP eseguirà sempre il file che si trova in
+ doc_root con le informazioni sul percorso URL, così puoi essere sicuro
+ che nessuno script venga eseguito al di fuori di questa
+ directory (tranne per user_dir
+ di seguito).
+
+
+ Un'altra opzione utilizzabile è user_dir. Quando user_dir non è
+ impostato, l'unica cosa che controlla nel file aperto è
+ doc_root. L'apertura di un URL come http://my.host/~user/doc.php non
+ comporta l'apertura di un file nella directory home dell'utente, ma di un file
+ chiamato ~user/doc.php in
+ doc_root (esatto, il nome della directory inizia con una tilde
+ [~]).
+
+
+ Se la user_dir è impostata, ad esempio, su public_php, una richiesta come http://my.host/~user/doc.php aprirà un file
+ file chiamato doc.php nella directory
+ denominata public_php sotto la home
+ directory dell'utente. Se la home dell'utente è /home/user, il file eseguito è
+ /home/user/public_php/doc.php.
+
+
+ L'espansione user_dir avviene indipendentemente
+ dall'impostazione doc_root, in modo da poter controllare
+ la radice del documento e l'accesso alla directory dell'utente
+ separatamente.
+
+
+
+
+ 4° Caso: script PHP fuori dalla cartella web
+
+ Un'opzione molto sicura è mettere il binario del parser PHP da qualche parte
+ al di fuori dell'cartella web dei file. In /usr/local/bin, per esempio. L'unico vero
+ lo svantaggio di questa opzione è che ora dovrai inserire una riga
+ simile a:
+
+
+
+
+
+ come prima riga di qualsiasi file PHP deve contenere il tag. Avrai anche bisogno di
+ rendere il file eseguibile. Dovrai fare esattamente come
+ tratteresti qualsiasi altro script CGI script in Perl o sh o un'altro
+ altro comune linguaggio di scripting che utilizza l'escape
+ #! come meccanismo per avviarsi.
+
+
+ Per far sì che PHP gestisca correttamente le informazioni PATH_INFO e
+ PATH_TRANSLATED in modo corretto con questa configurazione, è necessario
+ abilitare la direttiva cgi.discard_path.
+
+
+
+
+
+
diff --git a/security/database.xml b/security/database.xml
new file mode 100644
index 000000000..1b69433a1
--- /dev/null
+++ b/security/database.xml
@@ -0,0 +1,490 @@
+
+
+
+
+ Sicurezza del Database
+
+
+ Al giorno d'oggi, i database sono componenti essenziali di qualsiasi
+ applicazione basata sul Web, consentendo ai siti Web di fornire molti contenuti
+ dinamici. Poiché anche le informazioni sensibili o segrete possono
+ essere archiviate in un database, dovresti prendere seriamente in considerazione di
+ proteggere i tuoi database.
+
+
+ Per recuperare o archiviare qualsiasi informazione di cui hai bisogno per connetterti al database,
+ eseguire una query, recuperare il risultato e quindi chiudere la connessione.
+ Oggigiorno, il linguaggio più utilizzato per questo tipo di interazione è
+ l'SQL (Structured Query Language). Di seguito viene mostrato come un'aggressore può manometterlo con una query SQL.
+
+
+ Da come si può immaginare, PHP non può proteggere da solo il database.
+ Le prossime sezioni puntano a introdurre le modalità di come
+ accedere e manipolare ai database all'interno di uno script PHP.
+
+
+ Bisogna tener presente questa semplice regola: (Defense in Depth) difesa in profondità. Più prendi provvedimenti
+ per aumentare la sicurezza del database, minore è probabilità che un utente malintenzionato
+ riesca ad accedere o abusare di eventuali dati archiviati. Una buona progettazione
+ dello schema del database e dell'applicazione previene le tue più grandi paure.
+
+
+
+ Progettazione del database
+
+ Il primo passo è quello di creare il database, a meno che non si voglia utilizzarne uno
+ di terze parti. Una volta creato il database, viene assegnato un proprietario,
+ a chi ha eseguito l'istruzione di creazione. Di solito, solo il proprietario
+ (o l'amministratore) può fare qualsiasi cosa con gli oggetti di quel database e,
+ per consentire ad altri utenti di utilizzarlo, gli devono essere concessi dei privilegi.
+
+
+ Le applicazioni non dovrebbero mai connettersi al database come proprietario o
+ amministratore, poiché questi utenti possono eseguire qualsiasi query a piacimento,
+ ad esempio, potrebbero modificare lo schema (ad esempio eliminando le tabelle) o potrebbero
+ eliminare l'intero contenuto.
+
+
+ E' possibile creare vari utenti del database uno per ogni ruolo della tua applicazione
+ con diritti molto limitati sugli elementi del database. Dovrebbero essere concessi
+ solo i privilegi necessari per evitare che lo stesso utente possa modificare
+ il database tramite le diverse funzionalità. Ciò significa che se gli intrusi ottengono
+ l'accesso al tuo database utilizzando le credenziali delle tue applicazioni,
+ potrebbero apportare tutte le modifiche quante ne sono previste dai privilegi.
+
+
+
+
+ Connessione al database
+
+ E' possibile per una maggiore sicurezza stabilire connessioni SSL per criptare le
+ comunicazioni client/server oppure è possibile utilizzare SSH
+ per criptare la connessione di rete tra i client e il server del database.
+ Se viene utilizzato uno di questi sistemi, sarà difficile monitorare il traffico e ottenere
+ le informazioni del tuo database da parte di un potenziale malintenzionato.
+
+
+ Se il server del database ha il supporto nativo SSL, si può considerare l'uso delle funzioni OpenSSL per comunicazioni tra
+ PHP e database tramite SSL.
+
+
+
+
+ Modello d'archiviazione crittografato
+
+ SSL/SSH protegge i dati che viaggiano dal client al server: SSL/SSH
+ non protegge i dati persistenti archiviati in un database. SSL è un
+ protocollo on-the-wire.
+
+
+ Una volta che un utente malintenzionato ottiene l'accesso diretto al tuo database (aggirando il server web),
+ i dati sensibili memorizzati potrebbero essere esposti o utilizzati in modo improprio, a meno che
+ le informazioni siano protette dal database stesso. La crittografia dei dati
+ è un buon modo per limitare questa minaccia, ma pochissimi database offrono
+ questo tipo di crittografia dei dati.
+
+
+ Il modo più semplice per aggirare il problema è innanzitutto creare il proprio pacchetto di crittografia,
+ e quindi utilizzarlo nei tuoi script PHP. PHP
+ può aiutarti con diverse estensioni, come OpenSSL o Sodium, che impiega un'ampia varietà di algoritmi di crittografia.
+ Lo script cripta i dati prima di inserirli nel database e li decripta
+ durante il recupero. Vedere i riferimenti per ulteriori esempi
+ su come funziona la crittografia.
+
+
+
+ Hashing
+
+ Nel caso di dati veramente segreti , se non è necessaria la loro rappresentazione originale
+ (p.es. non dev'essere visualizzato), è necessario prendere in considerazione l'hashing.
+ Un'esempio ben noto di hashing
+ è il salvataggio dell'hash della password nel database,
+ invece della password stessa.
+
+
+ Le funzioni per le password
+ possono fornire un modo semplice per eseguire l'hashing dei dati sensibili e lavorare con questi hash.
+
+
+ password_hash viene utilizzato per eseguire l'hashing di una determinata stringa utilizzando
+ l'algoritmo più potente attualmente disponibile e password_verify
+ controlla se la password fornita corrisponde all'hash memorizzato nel database.
+
+
+ Campo per l'Hash della password
+
+
+
+]]>
+
+
+
+
+
+ SQL Injection
+
+ L'SQL injection è una tecnica dove un'utente malintenzionato sfrutta i difetti del
+ codice responsabile della creazione di query SQL dinamiche.
+ L'aggressore può accedere a sezioni privilegiate dell'applicazione,
+ recuperare tutte le informazioni dal database, manomettere i dati esistenti,
+ o addirittura eseguire comandi pericolosi a livello di sistema Host dul database.
+ La vulnerabilità si verifica quando gli sviluppatori concatenano o
+ interpolano dati arbitrari nelle loro istruzioni SQL.
+
+
+
+
+ Dividere il set di risultati in pagine ... e creare amministratori
+ (PostgreSQL)
+
+
+ Nell'esempio seguente, l'input dell'utente viene interpolato direttamente nella
+ Query SQL che consente all'aggressore di ottenere un account amministratore nel database.
+
+
+
+]]>
+
+
+ Di solito gli utenti usano i collegamenti "next", "previous" dove l'$offset
+ viene passato nell'URL. Lo script si aspetta che l'$offset
+ sia un numero. Tuttavia, cosa succede se qualcuno prova a craccarlo
+ aggiungendo quanto segue all'URL?
+
+
+
+
+
+ Se ciò dovesse accadere, lo script fornirebbe un accesso d'amministratore all'aggressore.
+ Tieni presente che 0; fornisce un offset valido alla query originale
+ e la terminerebbe.
+
+
+
+ Una tecnica comune per forzare il parser SQL a ignorare il resto della richiesta
+ query scritta dal programmatore è usare -- che introduce
+ i commenti in SQL.
+
+
+
+ Un modo possibile per ottenere le password è analizzare le pagine dei risultati di ricerca.
+ L'unica cosa che l'attaccante deve fare è vedere se sono presenti variabili inviate
+ utilizzate nelle istruzioni SQL che non vengono gestite correttamente. Questi filtri di solito possono essere impostati
+ in un form usato precedentemente e personalizzarlo usando le clausole WHERE, ORDER BY,
+ LIMIT e OFFSET nell'istruzione SELECT.
+ Se il database supporta il costrutto UNION,
+ l'aggressore potrebbe tentare di aggiungere un'intera query a quella originale per far elencare
+ le password da una tabella arbitraria. Si consiglia vivamente di salvare sole le secure hash delle password
+ anziché le password stesse.
+
+ Elencare gli articoli... e alcune password (può essere usato su qualunque database server).
+
+
+]]>
+
+
+ La parte statica della query può essere combinata con un'altra SELECT
+ per rivelare tutte le password:
+
+
+
+
+
+
+
+ Anche le istruzioni UPDATE e INSERT sono
+ suscettibili a tali attacchi.
+
+ Dalla reimpostazione di una password... all'acquisizione di più privilegi (per qualsiasi database server)
+
+
+]]>
+
+
+ Se un utente malintenzionato invia la stringa
+ per cambiare la password dell'amministratore
+ ' or uid like '%admin% in $uid
+ oppure impostare la variabile $pwd semplicemente con
+ hehehe', trusted=100, admin='yes per ottenere
+ privilegi più elevati, la query verrà aggirata:
+
+
+
+]]>
+
+
+
+
+ Mentre è scontato che un malintenzionato debba possederne almeno alcune nozioni
+ dell'architettura del database per condurre un'attacco ben riuscito ,
+ è spesso molto semplice ottenere queste informazioni. Per esempio,
+ il codice può far parte di un software open source ed essere disponibile al pubblico.
+ Tali informazioni potranno anche essere divulgate
+ tramite codice closed-source, anche se è codificato, offuscato o compilato -
+ e anche tramite il proprio codice attraverso la visualizzazione di messaggi di errore
+ Altri metodi includono l'uso di nomi di tabelle e colonne tipici. Per
+ ad esempio, un modulo d'accesso che utilizza una tabella "utenti" con nomi di colonne
+ "id", "username" e "password".
+
+
+
+
+ Attaccare il sistema operativo host del database (MSSQL Server)
+
+ Un preoccupante esempio di come è possibile accedere ai comandi a livello di sistema operativo
+ da parte di alcuni database su host.
+
+
+
+
+]]>
+
+
+ Se l'attaccante invia la stringa
+ a%' exec master..xp_cmdshell 'net user test testpass /ADD' --
+ a $prod, quindi $query sarà:
+
+
+
+]]>
+
+
+ MSSQL Server esegue le istruzioni SQL nel batch incluso un comando
+ per aggiungere un nuovo utente al database degli account locali. Se questa applicazione
+ era in esecuzione come sa e il servizio MSSQLSERVER era
+ in esecuzione con privilegi sufficienti, l'utente malintenzionato ora avrebbe un'account
+ con cui accedere a questa macchina.
+
+
+
+ Alcuni esempi sopra riportati sono legati ad uno specifico database, ma
+ non significa che un attacco simile sia impossibile verso altri prodotti.
+ Il tuo database potrebbe essere altrettanto vulnerabile in un altri modi.
+
+
+
+
+ Un esempio divertente dei problemi riguardanti SQL injection
+
+
+
+
+
+ Image courtesy of xkcd
+
+
+
+
+
+
+ Tecniche di elusione
+
+ Un modo consigliato per evitare l'SQL injection è associare tutti i dati
+ usando prepared-statements. L'utilizzo di query parametrizzate non è
+ sufficiente per evitare completamente l'injection SQL, ma è il modo più
+ semplice e sicuro per fornire l'input alle istruzioni SQL. Tutti i letterali
+ di dati dinamici nelle clausole WHERE,
+ SET e VALUES devono essere sostituiti
+ con un segnaposto. I dati effettivi verranno trasposti durante l'esecuzione e
+ inviati separatamente dal comando SQL.
+
+
+
+ Il binding dei parametri può essere utilizzato solo per i dati. Altre
+ parti dinamiche della query SQL devono essere filtrate in base a un elenco
+ noto di valori consentiti.
+
+
+
+ Eludere un'SQL injection usando PDO prepared Statement
+
+prepare("SELECT * FROM products WHERE id LIKE ? ORDER BY price {$sortingOrder}");
+// Il valore è reso disponibile usando LIKE
+$stmt->execute(["%{$productId}%"]);
+
+?>
+]]>
+
+
+
+
+
+ I Prepared statement sono forniti da
+ PDO,
+ MySQLi,
+ e da altre librerie per database.
+
+
+
+ Gli attacchi SQL injection sfruttano principalmente il codice scritto
+ senza pensare alla sicurezza. Non fidarti mai di nessun input, specialmente
+ dal lato client, anche se proviene da un menu a tendina,
+ un campo di input nascosto o un cookie. Il primo esempio mostra che una query così
+ semplice può causare disastri.
+
+
+
+ Una strategia di difesa in-depth comporta diverse Best Practics di scrittura del codice:
+
+
+
+ Non connettersi mai al database come amministratore o come proprietario.
+ Utilizzare sempre appositi utenti con privilegi minimi.
+
+
+
+
+ Controlla se l'input fornito è del tipo di dati previsto. PHP ha
+ una vasta gamma di funzioni per la convalida dell'input, da quelle più semplici
+ che si trovano in Funzioni variabili e
+ in Funzioni tipo carattere
+ (es.: rispettivamente is_numeric e ctype_digit)
+ oltre al supporto per le Espressioni regolari compatibili con Perl.
+
+
+
+
+ Se l'applicazione prevede un input numerico, prendere in considerazione la verifica dei dati
+ con ctype_digit, modificare con discrezione il suo tipo
+ usando settype o formattare la sua rappresentazione numerica
+ con sprintf.
+
+
+
+
+ Se l'interfaccia del database non supporta il binding delle variabili, allora
+ va messo tra virgolette ogni valore non numerico fornito dall'utente che viene passato al
+ database con la specifica funzione di escape del database per le stringhe (ad esempio
+ mysql_real_escape_string,
+ sqlite_escape_string, ecc.).
+ Le funzioni generiche come addslashes sono utili solo
+ in un ambiente molto specifico (ad esempio MySQL in un set di caratteri a singolo byte
+ con NO_BACKSLASH_ESCAPES disabilitato) e quindi è
+ meglio evitarle.
+ mysql_real_escape_string,
+
+
+
+
+ Non far visualizare a qualunque costo le informazioni dettagliate del database
+ e in particolare la struttura . Vedere anche le sezioniSegnalazione degli errori e Funzioni di gestione e registrazione degli errori.
+
+
+
+
+
+
+ Oltre a ciò, puoi trarre vantaggio dal log delle query tramite il tuo script
+ o, se lo supporta, attraverso il database stesso. Ovviamente, il log non è in grado
+ di prevenire alcun tentativo d'attacco, ma può essere utile per capire quale
+ applicazione è stata colpita. Il registro non è utile di per sé, ma
+ sono utili le informazioni che contiene. Generalmente più dettagli ci sono nel log meglio è.
+
+
+
+
+
+
diff --git a/security/errors.xml b/security/errors.xml
new file mode 100644
index 000000000..59593b0ea
--- /dev/null
+++ b/security/errors.xml
@@ -0,0 +1,150 @@
+
+
+
+
+
+
+
+ Segnalazione degli errori
+
+ Dal punto di vista della sicurezza di PHP, ci sono due aspetti nella segnalazione degli errori. Uno è
+ utile per aumentarne la sicurezza, l’altro è dannoso.
+
+
+ Una tattica d'attacco di solito prevede la profiliazione di un sistema reperendo
+ dati dagli errori, dal controllo dei tipi e dai contesti degli
+ errori che vengono restituiti. Ciò consente al cracker del sistema di analizzare
+ le informazioni del server, per determinare possibili punti deboli.
+ Ad esempio, se un'utente malintenzionato avesse raccolto informazioni su una pagina
+ con l'invio di un modulo precedente, potrebbe tentare di sovrascrivere le
+ variabili o modificarle:
+
+ Attaccare le Variabili in una pagina HTML personalizzata
+
+
+
+
+
+]]>
+
+
+
+
+ Gli errori che vengono normalmente restituiti da PHP possono essere molto utili allo
+ sviluppatore che sta tentando di eseguire il debug di uno script, indicando quali
+ funzioni o file hanno avuto esito negativo, il file PHP
+ e il numero di riga in cui si è verificato l'errore. Queste sono tutte le
+ informazioni che possono essere visualizzate. Non è raro che in php
+ lo sviluppatore debba utilizzare show_source,
+ evidenzia_stringa, o
+ highlight_file come strumento di debug, ma in
+ un sito live, questo può esporre le variabili nascoste, sintassi non controllate,
+ e altre informazioni pericolose. Particolarmente pericoloso è far eseguire
+ codice da fonti conosciute con gestori di debug incorporati o utilizzando
+ tecniche comuni di debug. Se l'attaccante può determinare quale
+ tecnica conosciuta stai usando, potrebbero provare a forzare una pagina,
+ inviando varie stringhe di debug usate da queste tecniche:
+
+ Sfruttare le variabili di debug classiche
+
+
+
+
+
+
+]]>
+
+
+
+
+ Indipendentemente dal metodo di gestione degli errori, la capacità di sondare un
+ sistema tramite gli errori porta a fornire ad un'utente malintenzionato
+ più informazioni.
+
+
+ Ad esempio, lo stile di un errore PHP generico indica che un sistema
+ sta eseguendo PHP. Se l'aggressore stava guardando una pagina .html e
+ volevo sondare il back-end (per cercare punti deboli noti nel
+ sistema), fornendo dati errati che potrebbero essere in grado di
+ determinare che un sistema è stato creato con PHP.
+
+
+ L'errore di una funzione può indicare se un sistema sta eseguendo uno
+ specifico database engine o fornire indizi su come una specifica pagina web, è
+ programmata o progettata. Ciò consente un'indagine più approfondita per
+ aprire porte del database o cercare bug o punti deboli specifici
+ di una pagina web. Fornendo diversi dati errati, per esempio,
+ un utente malintenzionato può determinare l'ordine di autenticazione in uno script,
+ (dagli errori con il numero di riga) e cercare i vari exploit che
+ possono essere sfruttati nello script.
+
+
+ Un errore di filesystem o un'errore generale di PHP può indicare quali autorizzazioni
+ il server web ha, nonché la struttura e l'organizzazione dei
+ file sul server web. Il codice di errore scritto dallo sviluppatore può aggravare
+ questo problema, portando ad un facile reperimento delle informazioni
+ di risorse precedentemente "nascoste".
+
+
+ Esistono tre soluzioni principali a questo problema. Il primo è quello
+ esaminare attentamente tutte le funzioni e tentare di risolvere la maggior parte
+ degli errori. Il secondo è disabilitare completamente la segnalazione degli errori
+ nel codice di produzione. Il terzo consiste nell'utilizzare la funzione custom
+ della gestione degli errori di PHP per creare il proprio gestore di errori. A seconda
+ sulla tua politica di sicurezza, potresti riuscire ad applicare tutte e tre
+ le soluzioni alla tua situazione.
+
+
+ Un modo per impedire in anticipo questo problema è quello di utilizzare
+ error_reporting di PHP, può aiutarti a
+ proteggere il tuo codice e trovare vari utilizzi che potrebbero essere pericolosi.
+ Testando il tuo codice, prima della distribuzione, con E_ALL,
+ puoi trovare rapidamente le aree in cui le tue variabili potrebbero essere
+ esposte all'inquinamento o alla modifica. Una volta pronto per la distribuzione,
+ dovresti disabilitare completamente la segnalazione degli errori impostando
+ error_reporting su 0 o disattivare l'opzione di visualizzazione
+ dell'errore nel file &php.ini; display_errors,
+ per isolare il codice dall'analisi(). Se scegli di applicare quest'ultima soluzione,
+ dovresti anche definire il percorso al tuo file registro usando il file
+ error_log e attivare nella direttiva ini
+ log_errors.
+
+ Trovare variabili pericolose con E_ALL
+
+
+]]>
+
+
+
+
+
+
diff --git a/security/figures/xkcd-bobby-tables.png b/security/figures/xkcd-bobby-tables.png
new file mode 100644
index 000000000..530ddc047
Binary files /dev/null and b/security/figures/xkcd-bobby-tables.png differ
diff --git a/security/filesystem.xml b/security/filesystem.xml
new file mode 100644
index 000000000..6557913a6
--- /dev/null
+++ b/security/filesystem.xml
@@ -0,0 +1,235 @@
+
+
+
+
+
+ Sicurezza del Filesystem
+
+ PHP dipende dalla gestione della sicurezza di molti sistemi server che usano
+ i permessi basati su file e directory. Ciò consente
+ di controllare quali file nel filesystem possono essere letti. Si dovrebbe prestare attenzione
+ a tutti i file che sono pubblici per garantire
+ che siano sicuri in lettura da parte degli utenti che hanno accesso a quel
+ file system.
+
+
+ Poiché PHP è stato progettato per consentire l'accesso a livello utente al file system,
+ potrebbe essere possibile scrivere uno script PHP che ti consenta
+ di leggere file di sistema come /etc/passwd, modificare le connessioni ethernet,
+ inviare enormi documenti in stampa, ecc. Questo suggerisce alcune
+ ovvie implicazioni, in quanto devi assicurarti che i file
+ da cui leggi e su cui scrivi siano quelli appropriati.
+
+
+ Considerate il seguente script, dove l'utente indica che vorrebbe
+ eliminare un file nella propria directory home. Ciò presuppone una
+ situazione in cui un'interfaccia web PHP viene regolarmente utilizzata per la
+ gestione dei file, quindi all'utente Apache è consentito eliminare i file nelle
+ directory home dell'utente.
+
+
+
+ Un controllo non accurato di una variabile porta a...
+
+
+]]>
+
+
+ Poiché il nome utente e il nome file possono essere inviati da un form,
+ possono inviare un nome utente e un nome file appartenenti a un'altro utente,
+ ed eliminarli anche se non dovrebbero essere autorizzati a farlo.
+ In questo caso, dovresti usare un'altra forma di autenticazione.
+ Considera cosa potrebbe accadere se le variabili inviate fossero
+ "../etc/" e "passwd".
+ Il codice quindi leggerebbe effettivamente:
+
+ ... un'attacco al filesystem
+
+
+]]>
+
+
+ Ci sono due misure importanti che dovresti adottare per prevenire questi problemi.
+
+
+
+ Consentire solo autorizzazioni limitate ai file binari da parte dell'utente web PHP.
+
+
+
+
+ Controllare tutte le variabili inviate.
+
+
+
+ Ecco uno script migliorato:
+
+ Controllo più sicuro dei nomi dei file
+
+
+]]>
+
+
+ Tuttavia, anche questo non è privo di difetti. Se il tuo sistema di autenticazione
+ consentiva agli utenti di creare i propri accessi e un'altro utente
+ voleva accedere a "../etc/", il sistema è nuovamente esposto. Per
+ questo motivo, potresti preferire scrivere un controllo più personalizzato:
+
+ Controllo più sicuro dei nomi dei file
+
+
+]]>
+
+
+
+
+ A seconda del sistema operativo, esiste un'ampia varietà di file
+ di cui dovresti preoccuparti, tra cui nomi di risorse (/dev/
+ o COM1), file di configurazione (file /etc/ e
+ file .ini), cartelle di archiviazione classiche (/home/,
+ My Documents), ecc. Per questo
+ motivo, di solito è più facile creare una policy in cui proibisci tutto tranne ciò che consenti esplicitamente.
+
+
+ Problemi relativi ai valori NULL
+
+ Poiché PHP utilizza le funzioni derivate da C per le operazioni correlate
+ al file system, potrebbero gestire i valori NULL in un modo del tutto inaspettato.
+ Poiché i valori NULL indicano la fine di una stringa in C, le stringhe che li contengono
+ non saranno valutate nella loro interezza, ma solo finché non incontreranno un valore NULL.
+
+ Il seguente fa vedere un codice vulnerabile che mostra questo problema:
+
+
+ Script vulnerabile ai valori NULL
+
+
+]]>
+
+
+
+ Pertanto, qualsiasi stringa contaminata utilizzata in un'operazione sul file system dovrebbe sempre
+ essere convalidata correttamente. Ecco una versione migliore dell'esempio precedente:
+
+
+ Convalida corretta dell'input
+
+
+]]>
+
+
+
+
+
+
+
diff --git a/security/general.xml b/security/general.xml
new file mode 100644
index 000000000..d86f4c617
--- /dev/null
+++ b/security/general.xml
@@ -0,0 +1,72 @@
+
+
+
+
+
+ Considerazioni Generali
+
+ Un sistema completamente sicuro è virtualmente impossibile, quindi un
+ approccio spesso utilizzato nella professione della sicurezza è quello
+ di bilanciare rischio e usabilità. Se ogni variabile inviata da un
+ utente richiedesse due forme di convalida biometrica (come una scansione
+ della retina e un'impronta digitale), si avrebbe un livello di identificazione
+ estremamente elevato. Ci vorrebbe anche mezz'ora per compilare un modulo abbastanza
+ complesso, il che porterebbe a incoraggiare gli utenti a trovare dei modi per
+ aggirare la sicurezza.
+
+
+ La migliore sicurezza è spesso abbastanza discreta da soddisfare
+ i requisiti senza che all'utente gli venga impedito di svolgere il proprio
+ lavoro o caricare troppo l'autore del codice con un'eccessiva complessità.
+ In effetti, alcuni attacchi alla sicurezza sono semplicemente degli exploit di
+ questo tipo di sicurezza eccessivamente complessa, che tende a perdersi nel tempo.
+
+
+ Una frase che vale la pena ricordare: un sistema è valido quanto l'anello più debole
+ di una catena. Se tutte le transazioni vengono registrate in modo massiccio in base a
+ ora, posizione, tipo di transazione, ecc. ma l'utente viene verificato solo in base a
+ un singolo cookie, la validità del collegamento degli utenti
+ al log degli accessi è gravemente compromessa.
+
+
+ Quando esegui un test, tieni presente che non sarai in grado di testare tutte le
+ casistiche, nemmeno per la più semplice delle pagine. L'input che
+ potresti aspettarti sarà completamente diverso dall'input fornito da
+ un dipendente insoddisfatto, un cracker con mesi di tempo libero o un gatto
+ che cammina sulla tastiera. Ecco perché è
+ meglio guardare il codice da una prospettiva logica, per discernere
+ dove possono essere introdotti dati imprevisti e quindi seguire come vengono
+ modificati, ridotti o amplificati.
+
+
+ Internet è pieno di persone che cercano di diventare famosi
+ violando il tuo codice, mandando in crash il tuo sito, pubblicando
+ contenuti inappropriati e rendendoti la giornata interessante in altri modi.
+ Non importa se hai un sito grande o piccolo, sei
+ un bersaglio semplicemente perché sei online, perché hai un server a cui
+ puoi connetterti. Molti programmi di cracking non distinguono le dimensioni del bersaglio,
+ semplicemente analizzano enormi blocchi di IP alla ricerca di vittime. Cerca di non
+ diventarne uno.
+
+
+
+
diff --git a/security/hiding.xml b/security/hiding.xml
new file mode 100644
index 000000000..f1ba05db2
--- /dev/null
+++ b/security/hiding.xml
@@ -0,0 +1,78 @@
+
+
+
+
+
+ Hiding PHP
+
+ In generale, la sicurezza tramite l'occultamento è una delle forme di sicurezza più deboli.
+ Ma in alcuni casi, ogni piccolo briciolo di sicurezza in più è benvenuto.
+
+
+ Alcune semplici tecniche possono aiutare a nascondere PHP, rallentando
+ eventualmente un aggressore che sta tentando di scoprire debolezze nel tuo
+ sistema. Impostando exhibit_php su off nel tuo
+ file &php.ini;, riduci la quantità di informazioni a loro disposizione.
+
+
+ Un'altra tattica è quella di configurare il server Web come Apache per
+ analizzare diversi tipi di file tramite PHP, con una direttiva &htaccess;
+ o nel file di configurazione di Apache. Puoi quindi
+ utilizzare estensioni di file falsi:
+
+ Nascondere PHP come se fosse un altro linguaggio
+
+
+
+
+ O lo nasconde completamente:
+
+ Using unknown types for PHP extensions
+
+
+
+
+ Oppure nasconderlo come codice HTML, ma questo fa si avrà un leggero calo di prestazioni perché
+ tutto l'HTML verrà processato tramite il motore di PHP:
+
+ Usando HTML come se fosse l'estensione di PHP
+
+
+
+
+ Per far funzionare tutto in modo efficace, devi rinominare i tuoi file PHP con
+ le estensioni di cui sopra. Sebbene sia una forma di sicurezza attraverso
+ l'occultamento, è una misura preventiva minore con pochi inconvenienti.
+
+
+
+
+
diff --git a/security/intro.xml b/security/intro.xml
new file mode 100644
index 000000000..ef11cf478
--- /dev/null
+++ b/security/intro.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+ Introduzione
+
+ PHP è un linguaggio potente e l'interprete, che sia incluso in un server web come modulo o eseguito come binario separato
+ CGI, è in grado di accedere ai file, eseguire
+ comandi e aprire connessioni di rete sul server. Queste
+ proprietà rendono qualsiasi cosa eseguita su un server web non sicura per default.
+ PHP è progettato specificamente per essere un linguaggio più sicuro per
+ scrivere programmi CGI rispetto a Perl o C e, con la corretta configurazione
+ in fase di compilazione e runtime e le corrette pratiche di codifica, può darti
+ giusta combinazione di libertà e sicurezza di cui hai bisogno.
+
+
+ Poiché ci sono molti modi per utilizzare PHP, ci sono molte opzioni
+ di configurazione che ne controllano il comportamento. Un'ampia selezione
+ di opzioni garantisce che puoi utilizzare PHP per diversi scopi, ma significa
+ anche che ci sono possibili configurazioni del server
+ che risultano non sicure.
+
+
+ La flessibilità di configurazione di PHP è pari alla flessibilità del codice.
+ PHP può essere utilizzato per creare applicazioni server
+ complete, con tutta la potenza di una shell, oppure può essere utilizzato
+ per semplici Server Side Include con pochi rischi e in un ambiente strettamente
+ controllato. Il modo in cui si crea quell'ambiente e quanto sia
+ sicuro, dipende in gran parte dallo sviluppatore PHP.
+
+
+ Questo capitolo inizia con alcuni consigli generali sulla sicurezza, spiega
+ le diverse combinazioni di configurazione e le situazioni
+ in cui possono essere utilizzate in modo sicuro e descrive diverse considerazioni nella
+ codifica per diversi livelli di sicurezza.
+
+
+
+
diff --git a/security/sessions.xml b/security/sessions.xml
new file mode 100644
index 000000000..6328797a6
--- /dev/null
+++ b/security/sessions.xml
@@ -0,0 +1,34 @@
+
+
+
+ Sicurezza della sessione
+
+
+ È importante mantenere sicura la gestione delle sessioni HTTP.
+ La sicurezza relativa alle sessioni è descritta nella sezione
+ Sessione e Sicurezza
+ del riferimento Gestione delle sessioni.
+
+
+
+
+
diff --git a/security/variables.xml b/security/variables.xml
new file mode 100644
index 000000000..fa73cb3a9
--- /dev/null
+++ b/security/variables.xml
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
+
+ Dati inviati dall'utente
+
+ La più grande debolezza di molti programmi scritti in PHP
+ non è insita nel linguaggio, ma semplicemente un problema di codice scritto
+ non tenendo a mente la sicurezza. Per questo motivo, dovresti sempre prenderti
+ il tempo di considerare le implicazioni di una certa parte di codice, per
+ accertare il possibile malfunzionamento se gli viene inviata una variabile
+ inaspettata.
+
+ Utilizzo pericoloso delle variabili
+
+
+]]>
+
+
+
+
+ Bisognerebbe esaminare attentamente il codice per assicurarci
+ che tutte le variabili inviate da un browser web siano state correttamente
+ controllate e porsi le seguenti domande:
+
+
+
+ Questo script avrà effetto solo sui file previsti?
+
+
+
+
+ Può un dato indesiderato o inusuale interferire con il funzionamento?
+
+
+
+
+ Questo script può essere utilizzato in modi non previsti?
+
+
+
+
+ Può essere usato insieme ad altri script in modo dannoso?
+
+
+
+
+ Le transazioni verranno adeguatamente tracciate?
+
+
+
+
+
+ Ponendosi queste domande durante la scrittura dello script,
+ piuttosto che farsele dopo, si previene una difficile riscrittura quando
+ invece si ha bisogno di migliorarne la sicurezza. Iniziando a usare queste
+ regole, non si garantisce la sicurezza del sistema, ma si può contribuire a
+ migliorarlo.
+
+
+ Migliorare la sicurezza disabilitando le impostazioni utili per nascondere
+ l'origine dei dati, la validità o l'integrità dell'input. La creazione di variabili implicite e
+ l'input incontrollato può portare a vulnerabilità come attacchi di injection e
+ manipolazione dei dati.
+
+
+ Funzionalità come register_globals e
+ magic_quotes (entrambi rimossi in PHP 5.4.0) hanno contribuito
+ ad agevolare questi rischi creando automaticamente variabili dall'input dell'utente e
+ escape dai dati in modo incoerente. Sebbene queste funzioni non siano più in PHP, persistono rischi simili
+ se la gestione dell'input è gestita in modo errato.
+
+
+ Abilitare error_reporting(E_ALL)
+ aiuta a rilevare le variabili non inizializzate e a convalidare l'input. Utilizzare la modalità strict
+ (declare(strict_types=1),
+ introdotto in PHP 7) per garantire la sicurezza dei tipi, prevenire conversioni involontarie,
+ e migliorare la sicurezza generale.
+
+
+
+