Protezione dei server Web PHP


31

Le applicazioni PHP hanno una reputazione per problemi di sicurezza superiori alla media. Quali tecniche di configurazione usi per assicurarti che l'applicazione sia il più sicura possibile?

Sto cercando idee come:

Di solito uso Linux, ma mi sento libero di suggerire anche soluzioni Windows.

Risposte:


15
  1. Usa la direttiva open_basedir per limitare i tuoi script PHP alla loro home directory ed eventuali directory extra dell'applicazione. Questo è molto efficace da solo.

  2. Usa php indurito perché non costa nulla e può aiutare.

  3. Usa suPHP per far eseguire gli script PHP come proprietario del file (un utente per sito Web) ed evita di utilizzare file con permessi errati come 777 ... suPHP può anche permetterti di avere php.ini per sito Web in modo che un sito sia stupido requisito non distruggere tutto.

  4. Mod_security è un grande vantaggio ma deve essere ben utilizzato e configurato.


Alcuni siti cattivi in ​​realtà hanno bisogno di register_globals e fopen, quindi è per questo che usi php.ini per sito con suPHP. Un sito può semplicemente diventare kamikaze e gli altri sono (quasi) perfettamente sicuri.
Antoine Benkemoun,

4
Se usano register_globals e fopen, suggerisce che la qualità è così scarsa che potresti voler riconsiderare il loro utilizzo :)
David Pashley,

Se pagano 150 € / mese, non riconsiderare.
Antoine Benkemoun,

3

Nella mia esperienza, la maggior parte delle vulnerabilità su un sito Web basato su PHP sono il risultato di un design (sito) scadente, piuttosto che di difetti nello stesso PHP.

Alcuni consigli rapidi:

  • Filtro universale , uscita di uscita. Precisazione: filtro non significa fuga, significa "se trovo qualcosa di sospetto in questo input dell'utente, causa il fallimento dell'invio e dice all'utente di riformattare".
  • Anziché utilizzare escapeshellcmd (), semplicemente non consentire l'esecuzione di alcun input dell'utente nella shell . È pericoloso e probabilmente mai realmente necessario.
  • Non chiamare funzioni come phpinfo () su un sito di produzione (o, se lo fai, vedi sotto *).
  • Quando si progetta un'applicazione Web, considerare sempre "è un possibile vettore di attacco?" Di ', iniezione SQL. Se la risposta è "sì", collegala immediatamente - non dire "ok, lo aggiungerò più avanti nello sviluppo come funzionalità". La sicurezza non è mai una caratteristica.
  • Non inviare mai errori non elaborati all'utente; questo significa impostare php.ini's display_errors = Off, log_errors = On. Intrappola gli errori di runtime e genera qualcosa di carino. Prendi la balena di Twitter come esempio: non fornirà all'utente informazioni a livello di debug, dice semplicemente "guai, qualcosa si è rotto, per favore aggiorna".

* Potresti anche dare un'occhiata a un breve post che ho scritto chiamato "Protezione phpinfo (), sorta di" e assicurati di leggere i commenti http://egovsergo.com/2009/04/03/protecting-your-phpinfo/ È stata una rapida idea che dovevo (in qualche modo) proteggere phpinfo () se in qualche modo avessi dimenticato di rimuoverlo in un sito di produzione.

In modo più generale, alcuni sviluppatori scrivono wrapper per funzioni sensibili che controllano se il flag "sito di produzione" non è impostato o meno e disabilitano la funzione sensibile in produzione.


La mia domanda era più su come proteggere il tuo server da PHP scritto male. :) Non intendevo dire che PHP stesso era insicuro, più che attrae sviluppatori meno esperti e la libreria standard richiede loro di ricordare di proteggere ogni chiamata, piuttosto che la libreria che protegge tutti gli utenti. +1 in quanto è una risposta molto utile.
David Pashley,

Ho avuto quell'impressione e ho risposto di conseguenza :) Grazie per il commento! Non riesco ad approfondire tutto qui, ovviamente, ma quelli sono dei grandi pozzi. Se hai domande più specifiche, puoi sicuramente porle su Stack Overflow e io e tutti gli altri contribuiremo. (E per quello che vale, sono una ZCE).
msanford,

3

Altri parametri che dovrebbero essere modificati per rafforzare il PHP:

safe_mode = Off
register_globals = Off
expose_php = Off
allow_url_fopen = Off
allow_url_include = Off
log_errors = On
error_log = /var/log/phperror.log
display_errors = Off
enable_dl = Off
disable_functions="popen,exec,system,passthru,proc_open,shell_exec,show_source,phpinfo"

Memorizza tutti gli errori PHP nel file /var/log/phperror.log :

touch /var/log/phperror.log
chmod 666 /var/log/phperror.log

1

Ho aggiunto i repository dotdeb al mio /etc/apt/sources.lst

deb http://packages.dotdeb.org stable all
deb-src http://packages.dotdeb.org stable all

Mentre patch php / apache / mysql molto più frequentemente di Debian.


1

Prendi in considerazione l'installazione su open_basedirbase "per sito". open_basedirè un'impostazione php.ini che impedisce agli script di accedere ai file al di fuori di una lista bianca definita. Se il tuo server ospita più siti, impedirà a un sito di leggere le impostazioni del database da un altro sito. Impedirà inoltre a uno script php di accedere / modificare i file di sistema di base. Open basedir è facile da configurare, basta aggiungere la linea " php_admin_value open_basedir /my/list/of/folders:/as/a/colon/seperated/list" a ciascun vhost Apache.

Considera anche di disattivare il motore di script PHP per tutti i siti / cartelle che non devono contenere script PHP (ad esempio una cartella di immagini caricata). Ancora una volta, questo è semplice, aggiungi "php_admin_value engine off" a qualsiasi Apache VirtualHosts che non necessita di php. Per disabilitare PHP in una directory, inserisci la stessa cosa in un tag Directory.

Esegui i permessi dei file il più stretto possibile, evita l'accesso in scrittura agli script PHP per l'utente Apache, questo impedisce a uno script in esecuzione di modificare se stesso o altri script sullo stesso sito / server. Evitare le autorizzazioni 777 se possibile, capire le autorizzazioni minime necessarie per eseguire l'applicazione e utilizzarle.

Se stai ospitando più siti, ognuno con il proprio database, utilizza un utente MySQL / Postgres separato per ciascuno e imposta le autorizzazioni su ciascun utente in modo tale che abbiano accesso solo ai database pertinenti. Ancora una volta ciò impedirà a uno script non autorizzato di manomettere il database di un'altra applicazione.

Anche Suosin, HardenedPHP, mod_security e simili sono tutti preziosi, ma li usano in aggiunta a una configurazione strettamente bloccata, non al posto di.


0

Suhosin ha un costo di prestazione piuttosto consistente, quindi il commento "non costa nulla" è un po 'fuori.


2
A che serve un sito Web veloce e compromesso? :) hardened-php.net/suhosin/benchmark.html suggerisce un 8,85% più lento su un benchmark. Ciò può essere accettabile per i vantaggi di sicurezza che fornisce. Questo probabilmente avrebbe dovuto essere un commento piuttosto che una risposta.
David Pashley,

La suhosin protegge principalmente dagli attacchi locali. Quindi, se condividi il tuo server con persone di cui non ti fidi, potrebbe valere la pena rallentare. Se hai il tuo server o la tua slice VM, non vedo il punto.

0

Stai cercando alcuni suggerimenti di base su firewall / topologia? Mi piace l'idea di usare cose come la sterlina per impedire l'accesso diretto al server web PHP da Internet non lavati. In questo modo puoi anche separare il server web da altre parti della tua rete.


No, sto cercando modi per migliorare la sicurezza del runtime di PHP.
David Pashley,

0

L'uso di Suhosin / mod_security / SuPHP renderà sicuramente sicuro il tuo server PHP. Disabilitare alcune funzioni come exec, passthru, system e escapeshellcmd sarà di grande aiuto.


1
Escapeshellcmd () non è solo usato per sfuggire alla stringa? Non fornisce alcun modo per eseguire un processo. Come potrebbe qualcuno usarlo per causare un problema?
David Pashley,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.