Protezione dei webserver PHP

Le applicazioni PHP hanno una reputazione di problemi di sicurezza superiori alla media. Quali tecniche di configuration utilizzate per assicurarvi che l'applicazione sia più sicura?

Sto cercando idee come:

  • Utilizzo di PHP / Suhosin temprato
  • Utilizzando mod_security
  • Distriggersre register_globals e allow_url_fopen in php.ini

Normalmente uso Linux, ma non esitate a suggerire soluzioni Windows.

  • Comprimere e ospitare grandi quantità di HTML statico
  • Percorsi di file assoluti / relativi che interessano il carico del server?
  • Perché è bene disporre di file di contenuto su un'unità separata rispetto all'unità di sistema (OS)?
  • Server locali e remoti con diverse distribuzioni Linux?
  • Come posso distribuire 1 applicazione tra 2 server
  • Che cos'è un stream di lavoro sensibile per distribuire il contenuto del webserver utilizzando la git push?
  • È opportuno inserire le applicazioni su un server secondario di Active Directory? Quali trappole?
  • Che ne dici di Windows 7 come server web?
  • 8 Solutions collect form web for “Protezione dei webserver PHP”

    1. Utilizza la direttiva open_basedir per limitare i tuoi script PHP nella loro directory di home e nelle eventuali directory di applicazioni extra. Questo è molto efficace da solo.

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

    3. Utilizzare suPHP per eseguire script di PHP come proprietario del file (un utente per sito web) e evitare di utilizzare file con cattive autorizzazioni come 777 … suPHP può anche consentire di avere su php.ini per sito web in modo che uno sito è stupido requisito non distruggere tutto.

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

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

    Alcuni consigli rapidi:

    • Ingresso filter universale , output di output. Clarificaiton: il filter non significa fuggire, significa che "se trovo qualcosa di pesante in questo input utente, provochi la trasmissione a fallire e dica all'utente di riformattare".
    • Piuttosto che usare escapeshellcmd (), semplicemente non consentire l'esecuzione di alcun input utente nella shell . È pericoloso e probabilmente non è mai necessario.
    • Non call funzioni come phpinfo () in un sito di produzione (o se lo fai, vedi sotto *).
    • Quando si progetta un'applicazione web, si consideri sempre "è questo un ansible vector d'attacco?" Diciamo, iniezione SQL. Se la risposta è "sì", inserisca immediatamente – non dici "ok, aggiungo che più tardi nello sviluppo come una caratteristica". La sicurezza non è mai una caratteristica.
    • Non emettere mai errori crudi per l'utente; questo significa impostare il display_errors di php.ini = Off, log_errors = On. Trap eseguire errori di run-time e output qualcosa di grazioso. Prendi la balena di Twitter come un esempio: non darà all'utente informazioni sul livello di debug, dice semplicemente "woops, qualcosa ha rotto, si prega di aggiornare".

    * Potresti anche guardare in un breve post che ho scritto chiamato "Protezione di phpinfo (), tipo" e assicuratevi di leggere i commenti http://egovsergo.com/2009/04/03/protecting-your-phpinfo/ Era un'idea veloce che wherevo (in qualche modo) proteggere phpinfo () se avessi dimenticato di rimuoverlo in un sito di produzione.

    In un modo più generale, alcuni sviluppatori scrivono wrapper per funzioni sensibili che controllano se non è impostata o less la bandiera di "produzione" e distriggers la function sensibile nella produzione.

    Altri parametri che dovrebbero essere modificati per indurire 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 

    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 

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

    Considera l'installazione di open_basedir su base "per sito". open_basedir è un'impostazione php.ini che impedirà agli script di accedere a file al di fuori di un elenco bianco definito. Se il tuo server ospita diversi siti, impedirà a un sito di leggere le impostazioni del database di un altro sito. Inoltre, impedirà ad uno script php di accedere / modificare i file di sistema di base. Aprire baseir è facile da impostare, basta aggiungere la linea " php_admin_value open_basedir /my/list/of/folders:/as/a/colon/seperated/list " a each Apache vhost.

    Si consideri anche la distriggerszione del motore di script PHP per tutti i siti / cartelle che non devono contenere script PHP (ad es. Una cartella di immagini caricate). Ancora una volta, questo è semplice, aggiungi "php_admin_value engine off" a qualsiasi Apache VirtualHost che non abbia bisogno di php. Per distriggersre PHP in una directory, metta la stessa cosa in un tag di Directory.

    Esegui le autorizzazioni di file più strette ansible, evitando l'accesso alla scrittura agli script PHP per l'utente di Apache, in modo da evitare che uno script in esecuzione modifichi se stesso o altri script sullo stesso sito / server. Evitate 777 autorizzazioni, se del resto, individuate le autorizzazioni minime necessarie per eseguire l'applicazione e utilizzarle.

    Se stai ospitando più siti, ognuno con il proprio database, utilizza un utente separato MySQL / Postgres per ciascuno e imposta le autorizzazioni per each utente in modo che abbiano accesso solo ai database rilevanti. Ancora una volta, questo impedirà che uno script falso altera il database di un'altra applicazione.

    Preferin, HardenedPHP, mod_security e simili sono tutti preziosi, ma utilizzarli in aggiunta a una configuration fortemente bloccata, non invece di.

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

    Stai cercando alcuni suggerimenti di base firewall / topologia? Mi piace l'idea di utilizzare cose come la sterlina per impedire l'accesso direttamente al server web PHP dalle internet non lavate. In questo modo è ansible anche separare il server web da altre parti della networking.

    Utilizzando Suhosin / mod_security / SuPHP certamente trasformsrà il tuo server PHP protetto. Distriggersre alcune funzioni come exec, passthru, system e escapeshellcmd contribuiranno anche molto.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.