Installer PHP
Aller à la navigation
Aller à la recherche
Le wiki : Accueil - Administrateur - Bureautique - Développeur - Intégrateur - Marketing - Multimédia - Objets numériques - Jeux - We make Hack
Installer PHP
Installer PHP sur GNU/Linux
Connaître la version de PHP
# Attention, la version la plus récente affichée ne correspond pas forcément à la version active.
# Utiliser "php -v" pour afficher la version la plus récente installée de PHP : php -v PHP 7.3.6-1 (cli) (built: May 31 2019 11:36:51) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.3.6, Copyright (c) 1998-2018 Zend Technologies with Zend OPcache v7.3.6-1, Copyright (c) 1999-2018, by Zend Technologies
# Si aucun paquet n'est installé, alors, le message suivant s'affiche : La commande « php » n'a pas été trouvée, mais peut être installée avec : sudo apt install php7.3-cli sudo apt install hhvm
# Toujours vérifier la version utilisée par Apache.
# Afficher uniquement la version de PHP utilisée par Apache2 : <?php echo 'Version courante de PHP : '. Phpversion(); ?>
# Utiliser la fonction phpinfo() pour obtenir toutes les informations concernant PHP : <?php phpinfo(); ?>
Connaître les versions supportées de PHP
Versions courante : https://www.php.net/supported-versions.php
Sources des anciennes versions de PHP : https://phpsources.net/scripts/php/php/versions/80_php
Désinstaller les paquets de PHP pour installer une version supérieure
# Arrêter Apache2 : sudo service apache2 stop
# Désactiver les modules PHP activés (Ne semble pas indispensable.) : # sudo a2dismod "Les modules PHP activés."
# Supprimer définitivement les paquets de PHP7.3 et purger, puis, lancer un autoremove. # Vérifier une dernière fois si il reste des paquets pour PHP7.3. Observer que le dossier /etc/php/7.3 ait bien été supprimé. sudo apt-get remove --purge php7.3 php7.3-curl libapache2-mod-php7.3 php7.3-cli php7.3-common php7.3-mbstring php7.3-gd php7.3-intl php7.3-xml php7.3-mysql php7.3-mcrypt php-zip sudo apt-get autoremove --purge sudo apt-get autoremove -y $( dpkg -l |awk ' /php7.3/ {print $2 }' |xargs)
# Si PHPMyAdmin est installé, refuser la suppression de PHPMyAdmin avec dbconfig-common. # Sa réinstallation se fera par la suite avec les mêmes données.
PHP 7.0
Lister le nom des paquets disponibles pour php7.0. Utiliser cette liste pour installer tous les paquets de PHP 7.0 sur GnU/Linux. sudo apt-cache pkgnames | grep php7.0
Installation des paquets pour Mint avec Apache2
sudo apt install php7.0 php7.0-curl libapache2-mod-php7.0 php7.0-cli php7.0-common php7.0-mbstring php7.0-gd php7.0-intl php7.0-xml php7.0-mysql php7.0-mcrypt php-zip
Le fichier php.ini de Apache2 : /etc/php7.0/apache2/php.ini.
Installation des paquets pour Mint avec Nginx
sudo apt-get install php7.0 php7.0-fpm php7.0-cli php7.0-common php7.0-mbstring php7.0-gd php7.0-intl php7.0-xml php7.0-mysql php7.0-mcrypt php7.0-zip
Le fichier php.ini de Nginx : /etc/php/7.0/fpm/php.ini
PHP 7.1
Mettre à jour les paquets de PHP 7.0 pour les paquets de PHP 7.1.
Choix du dépôt pour Mint - Ubuntu
sudo apt-get install python-software-properties sudo add-apt-repository ppa:ondrej/php sudo apt-get update # Sur le même modèle que les paquets utilisés pour installer PHP 7.0, on peut installer les paquets suivants pour PHP 7.1 : sudo apt install php7.1 php7.1-curl libapache2-mod-php7.1 php7.1-mysql php7.1-cli php7.1-common php7.1-mbstring php7.1-gd php7.1-intl php7.1-xml php7.1-mcrypt php-zip
# Un tutoriel propose des paquets supplémentaires pour PHP 7.1 ce qui semble être plus adapté : sudo apt install --no-install-recommends php7.1 php7.1-curl libapache2-mod-php7.1 php7.1-mysql php7.1-mbstring php7.1-gd php7.1-intl php7.1-xml php7.1-mcrypt php7.1-zip php7.1-json php7.1-msgpack php7.1-memcached php7.1-sqlite3 php7.1-gmp php7.1-geoip php7.1-redis
A la fin de cette installation, PHPMyAdmin n'est plus fonctionnel et doit être réinstallé. Réinstaller PHPMyAdmin avec sudo apt install phpmyadmin. Ne pas reconfigurer la base de données. Reconfigurer Apache2. PHPMyAdmin fonctionne à nouveau correctement.
PHP 7.2
Choix du dépôt pour Debian
apt-get install apt-transport-https lsb-release ca-certificates wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" >> /etc/apt/sources.list.d/php.list apt-get update
apt-get install php7.2 php7.2-opcache libapache2-mod-php7.2 php7.2-mysql php7.2-curl php7.2-json php7.2-gd php7.2-intl php7.2-mbstring php7.2-xml php7.2-zip php7.2-fpm php7.2-readline
service apache2 restart
Choix du dépôt pour Ubuntu
How to Install PHP 7.2, 7.1, 7.0 on Ubuntu 18.04 & 16.04 using PPA : https://tecadmin.net/install-php-7-on-ubuntu/
PHP 7.3
Choix du dépôt pour Debian
sudo apt-get install apt-transport-https lsb-release ca-certificates sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | tee /etc/apt/sources.list.d/php7.3.list apt-get update
Lister tous les paquets contenant PHP7.3 : apt-cache search php7.3
apt-get install php7.3 php7.3-opcache libapache2-mod-php7.3 php7.3-mysql php7.3-curl php7.3-json php7.3-gd php7.3-intl php7.3-mbstring php7.3-xml php7.3-zip php7.3-fpm php7.3-readline
Source : https://www.rosehosting.com/blog/how-to-install-php-7-3-on-debian-9/
PHP 7.4
Choix du dépôt pour Debian
sudo apt-get install apt-transport-https lsb-release ca-certificates sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg sudo bash echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | tee /etc/apt/sources.list.d/php7.4.list apt-get update
Lister tous les paquets contenant PHP7.4 : apt-cache search php7.4
apt-get install php7.4 php7.4-opcache libapache2-mod-php7.4 php7.4-mysql php7.4-curl php7.4-json php7.4-gd php7.4-intl php7.4-mbstring php7.4-xml php7.4-zip php7.4-fpm php7.4-readline
Les paquets supplémentaires suivants seront installés : fontconfig-config fonts-dejavu-core libfontconfig1 libgd3 libicu64 libjbig0 libjpeg62-turbo libonig5 libpcre2-8-0 libsodium23 libtiff5 libwebp6 libx11-6 libx11-data libxau6 libxcb1 libxdmcp6 libxpm4 libxslt1.1 libzip4 php-common php7.4-cli php7.4-common psmisc Paquets suggérés : php-pear libgd-tools Les NOUVEAUX paquets suivants seront installés : fontconfig-config fonts-dejavu-core libapache2-mod-php7.4 libfontconfig1 libgd3 libicu64 libjbig0 libjpeg62-turbo libonig5 libsodium23 libtiff5 libwebp6 libx11-6 libx11-data libxau6 libxcb1 libxdmcp6 libxpm4 libxslt1.1 libzip4 php-common php7.4 php7.4-cli php7.4-common php7.4-curl php7.4-fpm php7.4-gd php7.4-intl php7.4-json php7.4-mbstring php7.4-mysql php7.4-opcache php7.4-readline php7.4-xml php7.4-zip psmisc Les paquets suivants seront mis à jour : libpcre2-8-0
Source : https://kifarunix.com/install-php-7-4-on-debian-10-debian-9/
Installer différentes versions de PHP sur Debian avec un PPA
# Debian PPA # packages.sury.org/php echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" >> /etc/apt/sources.list.d/php.list
Installer différentes versions de PHP sur Ubuntu avec un PPA
# Ubuntu PPA # ppa:sergey-dryabzhinsky/php52 (5.3 à 7.2) # Sergey propose des PPA jusqu'à la version 7.2 de PHP. Source : https://launchpad.net/~sergey-dryabzhinsky/+archive/ubuntu/php55 # Version alternative pour PHP 5.5 : https://launchpad.net/~nickmoline/+archive/ubuntu/php55 # ppa:ondrej/php (5.6 à 7.4) sudo add-apt-repository ppa:ondrej/php
# Installer PHP 5.3 avec un PPA : sudo add-apt-repository ppa:sergey-dryabzhinsky/php53 sudo apt-get update sudo apt-get install php53p-cli libapache2-mod-php53
# Installer PHP 5.4 avec un PPA : sudo add-apt-repository ppa:sergey-dryabzhinsky/php54 sudo apt-get update sudo apt-get install php54-fpm libapache2-mod-php54
# Installer PHP 5.5 avec un PPA : sudo add-apt-repository ppa:sergey-dryabzhinsky/php55 sudo apt-get update sudo apt-get install php55-fpm libapache2-mod-php55
# Installer différentes versions de PHP 5.6 à PHP 7.4 avec un PPA : sudo apt-get install python-software-properties sudo add-apt-repository ppa:ondrej/php sudo apt-get update
# Installer PHP 5.6 : sudo apt-get install -y php5.6
# Installer PHP 7.0 : sudo apt-get install -y php7.0
# Installer PHP 7.1 : sudo apt-get install -y php7.1
# Installer PHP 7.2 : sudo apt-get install -y php7.2
# Installer PHP 7.3 : sudo apt-get install -y php7.3
# Installer PHP 7.4 : sudo apt-get install -y php7.4
# Activer PHP 5.3 PHP 5.4 ou PHP 5.5 : Activer ou désactiver le module phpXX ou XX est le numéro de version de PHP utilisé pour le nom du module libapache2-mod-phpXX qui a été installé.
# Activer PHP 5.6 PHP 7.0 PHP 7.1 PHP 7.2 PHP 7.3 ou PHP 7.4 : # Apache : sudo a2dismod php5.6 sudo a2enmod php7.0 sudo service apache2 restart
Source : https://tecadmin.net/install-php5-on-ubuntu/ Le contenu de cette recherche a été partagé sur le forum Ubuntu : https://forum.ubuntu-fr.org/viewtopic.php?pid=22196586#p22196586
Télécharger la machine virtuelle Ubuntu 16.04 pour VirtualBox (6.0) avec les PPA de PHP installés : https://drive.google.com/open?id=1v6ndFQhMncv350xH93NUR00VQ9QHNSPs
Installer différentes versions de PHP avec phpbrew
https://github.com/phpbrew/phpbrew
Source complémentaire : https://www.supinfo.com/articles/single/2982-gerer-multiples-versions-php-meme-serveur
Installer différentes versions de PHP en compilant les sources officielles
Utiliser les sources officielles pour installer une version de PHP et pouvoir basculer vers une autre.
Activer PHP-FPM
# Utiliser PHP-FPM permet d’améliorer la sécurité et les performances. # Le simple module PHP surcharge le serveur car chaque process Apache est rattaché à un moteur PHP complet.
# L'ajout de PHP-FPM ne semble fonctionner correctement qu’à partir de la version d’Apache 2.4.9. # Avant cette version, Apache ne pouvait pas utiliser les sockets Unix pour communiquer correctement avec le serveur PHP-FPM.
# Cette méthode pour activer PHP-FPM a été testée sur Debian avec PHP7.2 et PHP7.3.
# Pour activer PHP-FPM : # Activer le module proxy_fcgi, setenvif : sudo a2enmod proxy_fcgi setenvif # Activer la configuration de php7.3-fpm : sudo a2enconf php7.3-fpm # Il est indispensable de désactiver le module PHP pour permettre à PHP-FPM de fonctionner : sudo a2dismod php7.3
# Redémarrer Apache2 et PHP-FPM : sudo systemctl restart apache2 sudo service php7.3-fpm restart
# Si PHP-FPM est correctement activé, la valeur Apache 2.0 Handler devrait être remplacée par FPM/FastCGI depuis "phpinfo.php" à la ligne Server API :
# Suite à une modification du fichier php.ini, il n’est plus nécessaire de redémarrer le service apache2. Il faut redémarrer le service php7.3-fpm.
# En utilisant PHP-FPM, il est facile d’utiliser plusieurs version de PHP sur un même serveur Web et de choisir la version en fonction du vhost. # <FilesMatch \.php$> # SetHandler "proxy:unix:/var/run/php/php7.3-fpm.sock|fcgi://localhost/" # </FilesMatch>
# Vérifier que PHP-FPM est bien configuré pour utiliser les sockets : # grep -E '^\s*listen\s*=\s*[a-zA-Z/]+' /etc/php/7.3/fpm/pool.d/www.conf # Sinon, éditer la configuration pour permettre à PHP-FPM d'utiliser les sockets : # sudo nano /etc/php/7.3/fpm/pool.d/www.conf
Optimiser la consommation de RAM
# Éditer la configuration de PHP FPM : sudo nano /etc/php/7.2/fpm/pool.d/www.conf
# Tentative pour améliorer les performances sur un petit VPS de 1Go de RAM. pm = dynamic pm.max_children = 25 pm.start_servers = 2 pm.min_spare_servers = 2 pm.max_spare_servers = 4 pm.max_requests = 0 request_terminate_timeout = 35s
sudo service php7.2-fpm restart
# Vider puis consulter la mémoire disponible : free -h && sudo sysctl vm.drop_caches=3 && free -h
A tester : Optimiser l'environnement
https://www.christophe-meneses.fr/article/mettre-en-place-un-environnement-apache-php-fpm
Optimiser les Workers FPM
# Activer mpm worker pour PHP FPM : a2enmode mpm_worker
# Configurer l'un ou l'autre module : /etc/apache2/mods-enabled/mpm-event.conf /etc/apache2/mods-enabled/mpm-worker.conf
Configurer PHP FPM
# Éditer le fichier de configuration de PHP FPM : sudo nano /etc/php/7.3/fpm/pool.d/www.conf
# Avec un serveur VPS de 1Go de Ram, j'utilise actuellement la configuration suivante : pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3
# Le message d'erreur suivant se retrouve dans les logs : WARNING: [pool www] server reached pm.max_children setting (5), consider raising it.
# Je décommente la valeur suivante pour voir si il y a du mieux : pm.max_requests = 500
Sources complémentaires
# Optimisation étapes par étapes : https://medium.com/@sbuckpesch/apache2-and-php-fpm-performance-optimization-step-by-step-guide-1bfecf161534 # Configurer les workers de php-fpm pour traiter la charge : https://www.deltasight.fr/configurer-workers-php-fpm/ # https://stackoverflow.com/questions/18761239/apache-server-reached-maxclients-setting-consider-raising-the-maxclients-settin
Trouver les services PHP
whereis php php: /usr/bin/php7.3 /usr/bin/php /usr/lib/php /etc/php /usr/share/php7.3-json /usr/share/php7.3-opcache /usr/share/php7.3-gd /usr/share/php7.3-intl /usr/share/php7.3-readline /usr/share/php7.3-xml /usr/share/php7.3-curl /usr/share/php7.3-mysql /usr/share/php7.3-mbstring /usr/share/php7.3-zip /usr/share/php7.3-common /usr/share/php /usr/share/man/man1/php.1.gz
Configurer le fichier php.ini de PHP
# PHP peut être utilisé par un site web ou en ligne de commande. # Un fichier configure le site Web et un autre fichier configure les paramètres du serveur. # Les deux interpréteur PHP, web et ligne de commande, peuvent avoir des configurations différentes. # Deux fichiers php.ini peuvent donc exister.
PHP CLI is the command-line interface for PHP for creating standalone applications. PHP CGI is the common gateway interface for PHP for web applications.
# Utiliser php.info pour connaître le php.ini utilisé par le site Web.
# Utiliser le terminal pour trouver le php.ini sur le serveur avec la commande "locate php.ini". # Si locate ne trouve rien, utiliser "find / -name php.ini". # Rendu de la commande locate php.ini : cd /etc/php locate php.ini /etc/php/7.3/apache2/php.ini /etc/php/7.3/cli/php.ini /etc/php/7.3/fpm/php.ini
# Trouver le php.ini de PHP cli avec la commande "php --ini" : php --ini | grep "Loaded Configuration File" Loaded Configuration File: /etc/php/7.3/cli/php.ini
php --ini Configuration File (php.ini) Path: /etc/php/7.3/cli Loaded Configuration File: /etc/php/7.3/cli/php.ini Scan for additional .ini files in: /etc/php/7.3/cli/conf.d Additional .ini files parsed: /etc/php/7.3/cli/conf.d/10-mysqlnd.ini, /etc/php/7.3/cli/conf.d/10-opcache.ini, /etc/php/7.3/cli/conf.d/10-pdo.ini, /etc/php/7.3/cli/conf.d/15-xml.ini, /etc/php/7.3/cli/conf.d/20-calendar.ini, /etc/php/7.3/cli/conf.d/20-ctype.ini, /etc/php/7.3/cli/conf.d/20-curl.ini, /etc/php/7.3/cli/conf.d/20-dom.ini, /etc/php/7.3/cli/conf.d/20-exif.ini, /etc/php/7.3/cli/conf.d/20-fileinfo.ini, /etc/php/7.3/cli/conf.d/20-ftp.ini, /etc/php/7.3/cli/conf.d/20-gd.ini, /etc/php/7.3/cli/conf.d/20-gettext.ini, /etc/php/7.3/cli/conf.d/20-iconv.ini, /etc/php/7.3/cli/conf.d/20-intl.ini, /etc/php/7.3/cli/conf.d/20-json.ini, /etc/php/7.3/cli/conf.d/20-mbstring.ini, /etc/php/7.3/cli/conf.d/20-mysqli.ini, /etc/php/7.3/cli/conf.d/20-pdo_mysql.ini, /etc/php/7.3/cli/conf.d/20-phar.ini, /etc/php/7.3/cli/conf.d/20-posix.ini, /etc/php/7.3/cli/conf.d/20-readline.ini, /etc/php/7.3/cli/conf.d/20-shmop.ini, /etc/php/7.3/cli/conf.d/20-simplexml.ini, /etc/php/7.3/cli/conf.d/20-sockets.ini, /etc/php/7.3/cli/conf.d/20-sysvmsg.ini, /etc/php/7.3/cli/conf.d/20-sysvsem.ini, /etc/php/7.3/cli/conf.d/20-sysvshm.ini, /etc/php/7.3/cli/conf.d/20-tokenizer.ini, /etc/php/7.3/cli/conf.d/20-wddx.ini, /etc/php/7.3/cli/conf.d/20-xmlreader.ini, /etc/php/7.3/cli/conf.d/20-xmlwriter.ini, /etc/php/7.3/cli/conf.d/20-xsl.ini, /etc/php/7.3/cli/conf.d/20-zip.ini
Avec php 7.3
# Éditer la configuration : sudo nano /etc/php/7.3/apache2/php.ini
# Redémarrer le service : sudo service apache2 restart
Avec php 7.3 fpm
# Éditer la configuration : sudo nano /etc/php/7.3/fpm/php.ini
# Redémarrer le service : sudo service php7.3-fpm restart
Configurer php.ini depuis le dossier racine de son site
Il est possible de créer un fichier php.ini dans le dossier qui contient l'ensemble des fichiers et dossiers de votre CMS pour appliquer une configuration particulière. Désactiver par exemple le paramètre Output Buffering en ajoutant la ligne suivante : output_buffering = Off
Vérifier les fichiers logs régulièrement pour rester informé des erreurs rencontrées
Le chemin des logs de PHP est configuré depuis le fichier php.ini de PHP, par exemple "/var/log/php". Consulter cette page pour aller plus loin avec les logs : Gestion des logs. Suivre régulièrement les informations proposées dans les logs pour une bonne maintenance de son système.
Directives PHP
Introduction aux directives de PHP
# Le fichier "php.ini" pour configurer les directives pour PHP. # Le fichier "php.ini" pour PHP7.3 FPM : /etc/php/7.3/fpm/php.ini
# Redémarrer PHP après chaque modification dans les directives du fichier "php.ini". # Redémarrer PHP7.3 FPM : sudo service php7.3-fpm restart
# Afficher la valeur actuellement configurée pour une directive avec PHP et la fonction ini-get() : https://www.php.net/manual/fr/function.ini-get.php # Par exemple : <?php echo 'open_basedir = ' . ini_get('open_basedir') . "\n"; ?>
Liste des directives de php.ini : https://www.php.net/manual/en/ini.list.php Utiliser les sections avec php.ini : https://www.php.net/manual/en/ini.sections.php
Un ancien exemple de directives pour le fichier php.ini de PHP commenté en français sur une base Centos en 2014 : Exemple Apache pour le fichier de configuration php ini Cette page pourra être supprimée après relecture.
allow_url_fopen - Interdire l'ouverture et l'inclusion de fichiers distants
# Il est conseillé pour des raisons de sécurité d'interdire l'ouverture et l'inclusion de fichiers distants. # Manuel de la fonction fopen : https://secure.php.net/manual/en/function.fopen.php allow_url_fopen = Off allow_url_include = Off
Configurer Apache2 + PHP + FastCGI ou cgi comme décrit ici. PHP fonctionne avec FastCGI qui permet de réduire l'encombrement de la mémoire du serveur Web tout en bénéficiant de la vitesse et de la puissance de l'ensemble du langage PHP. La directive de configuration cgi.force_redirect empêche quiconque d'appeler directement PHP avec une URL telle que http://www.domaine.ext/cgi-bin/php/hack/backdoor.php.
# Activer cgi.force_redirect pour des raisons de sécurité. cgi.force_redirect=On
disable_functions - Désactiver certaines commandes potentiellement dangereuses
Vérifier que le site fonctionne correctement, sinon, identifier la commande trop restrictive.
disable_functions = php_uname, getmyuid, getmypid, passthru, leak, listen, diskfreespace, tmpfile, link, ignore_user_abord, shell_exec, dl, exec, system, highlight_file, source, show_source, fpaththru, virtual, posix_ctermid, posix_getcwd, posix_getegid, posix_geteuid, posix_getgid, posix_getgrgid, posix_getgrnam, posix_getgroups, posix_getlogin, posix_getpgid, posix_getpgrp, posix_getpid, posix, _getppid, posix_getpwnam, posix_getpwuid, posix_getrlimit, posix_getsid, posix_getuid, posix_isatty, posix_kill, posix_mkfifo, posix_setegid, posix_seteuid, posix_setgid, posix_setpgid, posix_setsid, posix_setuid, posix_times, posix_ttyname, posix_uname, proc_open, proc_close, proc_get_status, proc_nice, proc_terminate, pcntl_alarm, pcntl_fork, pcntl_waitpid, pcntl_wait, pcntl_wifexited, pcntl_wifstopped, pcntl_wifsignaled, pcntl_wifcontinued, pcntl_wexitstatus, pcntl_wtermsig, pcntl_wstopsig, pcntl_signal, pcntl_signal_get_handler, pcntl_signal_dispatch, pcntl_get_last_error, pcntl_strerror, pcntl_sigprocmask, pcntl_sigwaitinfo, pcntl_sigtimedwait, pcntl_exec, pcntl_getpriority, pcntl_setpriority, pcntl_async_signals
# Fonctions recommandées pour la désactivation d'après le site : http://php.xmb.cz/disable-functions/ : disable_functions = apache_child_terminate, apache_get_modules, apache_get_version, apache_getenv, apache_lookup_uri, apache_note, apache_request_headers, apache_reset_timeout, apache_response_headers, apache_setenv, getallheaders, virtual,chdir, chroot, exec, passthru, proc_close, proc_get_status, proc_nice, proc_open, proc_terminate, shell_exec, system, chgrp, chown, disk_free_space, disk_total_space, diskfreespace, filegroup, fileinode, fileowner, lchgrp, lchown, link, linkinfo, lstat, pclose, popen, readlink, symlink, umask, cli_get_process_title, cli_set_process_title, dl, gc_collect_cycles, gc_disable, gc_enable, get_current_user, getmygid, getmyinode, getmypid, getmyuid, php_ini_loaded_file, php_ini_scanned_files, php_logo_guid, php_sapi_name, php_uname, sys_get_temp_dir, zend_logo_guid, zend_thread_id, highlight_file, php_check_syntax, show_source, sys_getloadavg, closelog, define_syslog_variables, openlog,pfsockopen, syslog, nsapi_request_headers, nsapi_response_headers, nsapi_virtual, pcntl_alarm, pcntl_errno, pcntl_exec, pcntl_fork, pcntl_get_last_error, pcntl_getpriority, pcntl_setpriority, pcntl_signal_dispatch, pcntl_signal, pcntl_sigprocmask, pcntl_sigtimedwait, pcntl_sigwaitinfo, pcntl_strerror, pcntl_wait, pcntl_waitpid, pcntl_wexitstatus, pcntl_wifexited, pcntl_wifsignaled, pcntl_wifstopped, pcntl_wstopsig, pcntl_wtermsig, posix_access, posix_ctermid, posix_errno, posix_get_last_error, posix_getcwd, posix_getegid, posix_geteuid, posix_getgid, posix_getgrgid, posix_getgrnam, posix_getgroups, posix_getlogin, posix_getpgid, posix_getpgrp, posix_getpid, posix_getppid, posix_getpwnam, posix_getpwuid, posix_getrlimit, posix_getsid, posix_getuid, posix_initgroups, posix_isatty, posix_kill, posix_mkfifo, posix_mknod, posix_setegid, posix_seteuid, posix_setgid, posix_setpgid, posix_setsid, posix_setuid, posix_strerror, posix_times, posix_ttyname, posix_uname, setproctitle, setthreadtitle, shmop_close, shmop_delete, shmop_open, shmop_read, shmop_size, shmop_write
# phpinfo : Utilisé pour vérifier les valeurs de la configuration. # php_uname : Empêche l'affichage des liens du wiki dans le module Joomla. # set_time_limit : Got error 'PHP message: PHP Warning: set_time_limit() has been disabled for security reasons in /var/www/wiki.visionduweb.fr/includes/GlobalFunctions.php on line 2958 (Mediawiki).
display_errors log_errors error_log - Ne pas afficher les erreurs PHP mais les journaliser
# Depuis le fichier de configuration de PHP : sudo nano /etc/php/7.3/fpm/php.ini
# Ne pas afficher les erreurs sur le site : display_errors=Off
# Journaliser les erreurs vers un fichier : log_errors=On # error_log = syslog # error_log = /var/log/php7.3-fpm.log error_log = /var/log/apache2/php_errors.log
# Les droits appliqués au fichier de log : -rw------- root root php_errors.log
# Le chemin vers le fichier de log est également indiqué depuis le fichier /etc/php/7.3/fpm/php-fpm.conf : ;error_log = /var/log/php7.3-fpm.log sudo nano /etc/php/7.3/fpm/php-fpm.conf
error_reporting - Vérifier les variables non-initialisées
Pour vérifier les variables non-initialisées, utiliser la fonction error_reporting qui peut afficher les erreurs de niveau E_NOTICE.
# La directive display_errors doit ici être passée à On.display_errors = On
error_reporting = E_ALL
# La directive error_reporting peut également être initialisée directement dans le code source d'une page PHP : Ajouter au dessous de l'ouverture de la balise<?php
ini_set('error_reporting', E_ALL);
error_reporting(E_ALL);
@ini_set('display_error','1');
Source complémentaire : https://itinterviewguide.com/php-error-reporting/
error_log - Chemin du fichier de log de PHP
error_log = /var/log/apache2/php_errors.log
# Peut aussi être configuré pour rediriger les messages vers syslog-NG.
expose_php - Ne pas afficher la version de PHP
Définir expose_php = Off empêche simplement le serveur Web de renvoyer l'en-tête X-Powered-By.
C'est une bonne chose à faire, mais ne vous attendez pas à ce qu'elle offre beaucoup de protection. Les pirates potentiels pourraient rechercher des versions obsolètes de PHP avec des failles de sécurité à exploiter même si cet en-tête est désactivé.
Les services tiers ne devraient pas avoir à se soucier de la version de PHP utilisée. Le contenu doit être mis à disposition dans des formats indépendants de la plate-forme tels que JSON, XML. Les services doivent pouvoir être utilisés par toutes les plates-formes et pas uniquement pour le langage PHP.
expose_php = Off
ignore_repeated_errors - Ne pas loguer une erreur récurrente
On supprimera plusieurs occurrences des mêmes erreurs lorsqu'elles proviennent de la même ligne du même fichier. ignore_repeated_errors = On
Ignore_repeated_errors dans le fichier système php.ini peut interférer avec les tests, provoquant de faux rapports d'échecs.
Manuel des directives d'erreurs : https://www.php.net/manual/en/errorfunc.configuration.php
ignore_repeated_source - Ne pas loguer une erreur récurrente sur plusieurs lignes ou fichiers
On supprimera plusieurs occurrences des mêmes erreurs, même si elles proviennent de lignes différentes dans des fichiers différents. ignore_repeated_source = Off
magic_quotes
# Cette fonctionnalité a été utilisée depuis PHP 5.3.0 mais a été supprimée depuis PHP 5.4.0.
# Magic quotes for incoming GET/POST/Cookie data. # magic_quotes_gpc = Off
# Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc. # magic_quotes_runtime = Off
# Use Sybase-style magic quotes (escape ' with instead of \'). # magic_quotes_sybase = Off
# Si l'accès à la configuration du serveur n'est pas disponible, l'utilisation de .htaccess est également une option : # php_flag magic_quotes_gpc Off
mail.log - Obtenir les logs des mails envoyés avec la fonction mail()
# Cette directive existe depuis PHP5.3 et permet d'obtenir les logs des mails envoyés avec la fonction PHP mail() depuis le serveur ou le site Web. # Les lignes suivantes permettent d'activer la directive mail.log depuis la configuration PHP via le fichier php.ini pris en compte par le serveur Apache2.
# Créer un répertoire et un fichier de log spécifique aux mails envoyés avec PHP : cd /var/log sudo mkdir php-7.3-fpm sudo chown www-data. -R php-7.3-fpm/ cd php-7.3-fpm/ sudo touch mail-php.log sudo chown www-data. mail-php.log sudo chmod 600 mail-php.log
;# Ajoute une ligne avec des informations dans les logs des mails : En-tête X-PHP-Originating-Script qui inclue un UID unique pour le script et le nom du fichier. ;# Je veux obtenir les informations précises sur les mails. La directive est activée avec On. ;# Valeur en production : Off mail.add_x_header = On ;# Suivi des logs des mails. ;# Valeurs de production : le chemin vers un fichier de log spécifique à PHP. mail.log = /var/log/php-7.3-fpm/mail-php.log
# Redémarrer le service PHP pour appliquer les changements : sudo service php7.3-fpm restart
max_execution_time - Contrôler les ressources
max_execution_time = 30
max_input_time - Contrôler les ressources
max_input_time = 30
memory_limit - Augmenter la mémoire de PHP
# Augmenter la mémoire de PHP. # La valeur par défaut de memory_limit est de 128M : memory_limit = 128M
# La directive open_basedir définit les répertoires à partir desquels PHP est autorisé à accéder aux fichiers en utilisant des fonctions comme fopen(). # Si un fichier est en dehors des chemins définis par open_basdir, PHP refusera de l'ouvrir. # Un lien symbolique comme solution de contournement ne devrait pas fonctionner.
; Limiter l'accès de PHP au système de fichiers : open_basedir = /var/www/site
# Il sera par exemple impossible d'inclure le fichier suivant depuis la racine du site pour exploiter des informations en parcourant le système de fichiers du serveur : ../../../../../../../etc/passwd
; Limiter le processus PHP au répertoire spécifié : open_basedir="/var/www/html/" ; ------------------------------------ ; Limiter le processus PHP aux répertoires spécifiés : ; open_basedir="/home/httpd/vhost/cyberciti.biz/html/:/home/httpd/vhost/nixcraft.com/html/:/home/httpd/vhost/theos.in/html/" ; ------------------------------------
Il est possible (Voir conseillé ?) de configurer le répertoire open_basedir directement depuis le VirtualHost.
Définir open_basedir dans le Virtualhost de chaque site
# Il semble préférable de définir le open_basedir directement depuis le fichier VirtualHost directement pour éviter les erreurs dans /var/log/apache2/error.log tail /var/log/apache2/error.log
# Ajouter la directive open_basedir dans un Virtualhost : <VirtualHost wiki.visionduweb.fr:443> ServerName wiki.visionduweb.fr ServerAdmin contacter@visionduweb.fr DocumentRoot /var/www/wiki.visionduweb.fr ...
# Définir la valeur open_basedir pour le site. # Avec cette valeur le site est fonctionnel, mais, c'est la valeur globale par défaut, et entraîne une erreur dans les logs. SetEnv PHP_ADMIN_VALUE "open_basedir=/var/www"
# Avec cette valeur le site ne semble plus fonctionnel et affiche l'erreur directement sur le site ! SetEnv PHP_ADMIN_VALUE "open_basedir=/var/www/wiki.visionduweb.fr"
# Création d'un dossier temporaire "tmp" à la racine du wiki : cd /var/www/ sudo mkdir tmp_php sudo chown www-data:www-data -R tmp_php/ sudo chmod 750 -R tmp_php/
# Je change la configuration du chemin pour la directive en prenant en compte le sous dossier du wiki. # Le message d'erreur n'est plus logué. SetEnv PHP_ADMIN_VALUE "open_basedir=/var/www/wiki.visionduweb.fr/:/tmp_php/"
Si cette toute dernière commande ne semble pas retourner d'erreur pour le wiki, en revanche, le site principale retourne une erreur : AH01071: Got error 'PHP message: PHP Warning: file_exists(): open_basedir restriction in effect. File(/var/www/visionduweb.fr/defines.php) is not within the allowed path(s): (/var/www/wiki.visionduweb.fr/:/tmp/) in /var/www/visionduweb.fr/index.php on line 29PHP message: PHP Warning: file_exists(): open_basedir restriction in effect. File(/var/www/visionduweb.fr/libraries/joomla) is not within the allowed path(s): (/var/www/wiki.visionduweb.fr/:/tmp/) in /var/www/visionduweb.fr/libraries/loader.php on line 340PHP message: PHP Fatal error: Uncaught RuntimeException: Library path /libraries/joomla cannot be found. in /var/www/visionduweb.fr/libraries/loader.php:344\nStack trace:\n#0 /var/www/visionduweb.fr/libraries/loader.php(490): JLoader::registerPrefix('J', '/libraries/joom...')\n#1 /var/www/visionduweb.fr/libraries/import.legacy.php(52): JLoader::setup()\n#2 /var/www/visionduweb.fr/includes/framework.php(15): require_once('/var/www/vision...')\n#3 /var/www/visionduweb.fr/index.php(40): require_once('/var/www/vision...')\n#4 {main}\n thrown in /var/www/visionduweb.fr/libraries/loader.php on line 344'
# Je change à nouveau la configuration du chemin pour la directive. # L'ensemble des messages d'erreurs disparaissent. SetEnv PHP_ADMIN_VALUE "open_basedir=/var/www/:/tmp/"
# Pourquoi le VirtualHost du wiki.visionduweb.fr entraîne une erreur sur le site visionduweb.fr qui a lui même sont propre VirtualHost. # J'ai bien deux dossiers pourtant, pour les deux sites : /var/www/visionduweb.fr et /var/www/wiki.visionduweb.fr
# Pour pouvoir définir le bon dossier open_basedir pour chaque site, désactiver la directive open_basedir depuis la configuration de PHP et l'inclure directement dans chaque VirtualHost. # Les sites peuvent être restreints à leur propre open_basedir en ajoutant une seule ligne dans leur VirtualHost et il n'y a plus d'erreur dans les logs. # Cette fois, ça fonctionne : SetEnv PHP_ADMIN_VALUE "open_basedir=/var/www/visionduweb.fr/:/tmp_php/" SetEnv PHP_ADMIN_VALUE "open_basedir=/var/www/wiki.visionduweb.fr/:/tmp_php/" SetEnv PHP_ADMIN_VALUE "open_basedir=/var/www/green-adn.fr/:/tmp_php/"
# Create non-world-readable directory ? cd /var/www/visionduweb.fr sudo mv tmp/ joomla_tmp
--> Vérifier Joomla Extensions - Avertissements --> PHPinfo ne trouve non plus pas de valeur pour upload_tmp_dir. Etrange que Joomla considère alors que upload_tmp_dir est défini. --> Une issue est ouvert sur le Github de Joomla : https://github.com/joomla/joomla-cms/issues/25756
# Les droits à appliquer à un dossier /tmp : https://www.thegeekdiary.com/unix-linux-what-is-the-correct-permission-of-tmp-and-vartmp-directories/
--> # Finalement, je pourrais me contenter du /var/tmp qui appartient à root ? ( préférer tout de me un dossier tmp spécifique pour php ? /var/www/php ou /var/tmp/php ?
cd /var/tmp sudo mkdir php /var/tmp$ sudo chown www-data:www-data php/ /var/tmp$ sudo chmod 1777 php/
; A définir depuis chaque VirtualHost ; open_basedir ; Définir globalement dans la configuration de PHP : upload_tmp_dir=/var/tmp/php sys_temp_dir=/var/tmp/php
{ # Voir aussi PrivateTmp=true (Concerne le système.) PrivateTmp=true }
# voir également : https://support.plesk.com/hc/en-us/articles/360001540233-How-to-change-the-directory-for-storing-temporary-PHP-files-of-a-particular-PHP-version-on-a-Plesk-server open_basedir = {WEBSPACEROOT}{/}{:}{TMP}{/}:/var/tmp Pour VHost :
# Fonctionne à l'usage sans les 2 erreurs sur PhpSecInfo # -- Avec open_basedir désactivé en global et upload_tmp_dir + sys_temp -> /var/tmp Exemple d'inclusion du répertoire /var/lib/php/sessions dans open_basedir : SetEnv PHP_ADMIN_VALUE "open_basedir=/var/www/visionduweb.fr/:/tmp/:/var/lib/php/sessions"
#############################################
Au final je désactive tout ça avec SetEnv sur les 3 sites, car, je constate que mon PHPinfo n'affiche pas / plus les informations renseignées depuis le fichier /etc/php/7.3/fpm/php.ini ( Je me rend compte que j'avais des commentaires ### qui pouvaient bloquer la config !!! au lieu d'être en ;;; )
J'ai utilisé le php.ini de /etc/php/7.3/fpm/php.ini pour écraser le php.ini de /etc/php/7.3/apache2/php.ini
J'utilise le fichier /etc/php/7.3/fpm/pool.d/www.conf pour ajouter ma configuration exim qui est à nouveau prise en compte : php_admin_value[sendmail_path] = /usr/sbin/exim4 -t -i -F mail@visionduweb.com -f mail@visionduweb.com
>> Je remet le /etc/php/7.3/apache2/php.ini original que j'avais sauvegardé. >> Je remet 80M pour les valeurs de post_max dans le sudo nano /etc/php/7.3/fpm/php.ini // Je remet upload_tmp_dir="/var/www/tmp_php" + session.save_path = "/var/www/tmp_php" dans le php.ini global de php7.3-fpm <---- non-world-readable directory ??? // Je décommente la valeur de sendmail dans le /etc/php/7.3/fpm/pool.d/www.conf >> Je redémarre. Je retrouve à nouveau les bonnes valeurs sur le PHP info ! (local + master)
Todo
Le php-fpm ne voit pas le même contenu pour /var/tmp à cause du fichier systemd.service utilisant PrivateTmp=true Sinon, configurer aussi le php.ini de apache autre que celui pour fpm ?
Réécrire les VirtualHost correctement en ajoutant la ligne pour tous les domaines. A suivre. Vérifier que l'antibadbot soit activé sur chaque vhost.
post_max_size
# Les deux directives doivent avoir les mêmes valeurs : (Obligatoire ?)
upload_max_filesize = 32M post_max_size = 32M
sendmail_from - Pour Windows uniquement - Adresse de l'expéditeur
sendmail_from = mail@visionduweb.com
Manuel : http://php.net/sendmail-from
sendmail_path - Pour Unix et Linux uniquement - Configuration d'envoi des mails PHP par le service mail approprié
# Renseigner le service qui va émettre le mail envoyé depuis PHP ainsi que l'adresse d'expédition et de retour. # Dans cet exemple Exim a été installé et configuré pour servir d'émetteur de mails.
; sendmail -t -i ; sendmail_path = /usr/sbin/sendmail -t -i ; sendmail_path = /usr/sbin/sendmail -t -i -F mail@visionduweb.com -f mail@visionduweb.com sendmail_path = /usr/sbin/exim4 -t -i -F mail@visionduweb.com -f mail@visionduweb.com
Manuel : http://php.net/sendmail-path
session.save_path - Chemin d'enregistrement des sessions
# Les sessions font parties des éléments les plus convoités par les Hackers. # Le support de session PHP permet de préserver certaines données lors des accès au site. # Cela permet de créer des applications plus personnalisées et d'accroître l'attrait pour le site.
; session.save_path = "/var/lib/php/sessions" session.save_path = "/var/www/tmp_php"
# S'assurer que le chemin est en dehors de /var/www/html et qu'il n'est pas lisible ni inscriptible par aucun autre utilisateur du système ! # Ce répertoire est créé ainsi : cd /var/www sudo mkdir tmp_php sudo chown -R www-data:www-data tmp_php/ sudo chmod -R 1700 tmp_php/
# Les droits suivants sont affichés : ls -la drwx-----T 2 www-data www-data 61440 sept. 12 01:12 tmp_php
# Utiliser SELinux pour protéger le répertoire.
# L'option -Z de la commande ls affiche le contexte de sécurité SELinux (Le mode de fichier, l'utilisateur, le groupe, le contexte de sécurité et le nom du fichier.) : ls -Z /var/www/ ? html ? html-BAK
# Vérifier si ps peut interroger un répertoire - > A faire < - ps axZ | grep /var/www/ unconfined 28093 pts/0 S+ 0:00 grep --color=auto /var/www/
# Vérifier si ps retourne des valeurs pour le service apache2 - > A faire < - ps axZ | grep apache2 unconfined 1505 ? Ss 0:01 /usr/sbin/apache2 -k start unconfined 18504 pts/0 S+ 0:00 grep --color=auto apache2 unconfined 21575 ? S 0:00 /usr/sbin/apache2 -k start unconfined 21597 ? S 0:00 /usr/sbin/apache2 -k start
Manuel : http://php.net/session.save-path
session.cookie_httponly - Refuser la manipulation des sessions avec JavaScript
# Il est déconseillé de manipuler les sessions à l'aide de JavaScript. # Avec cette directive, JavaScript ne pourra lire les sessions, afin d'éviter les attaques de type XSS. session.cookie_httponly = 1
sql.safe_mode
# Supprimé de PHP depuis la version de PHP5.4 et génère une erreur fatale de niveau E_CORE_ERROR lorsqu'il est activé. # sql.safe_mode=On
sys_temp_dir
# Répertoire où les fichiers temporaires doivent être placés. # La valeur par défaut est celle du système (Voir "sys_get_temp_dir".) # sys_temp_dir = "/tmp"
# Je défini la valeur de cette directive sys_temp_dir avec la même valeur que celle utilisée pour définir upload_tmp_dir. # Je voudrais dans un premier temps la définir à /var/tmp mais le CHMOD me surprend : drwxrwxrwt 5 root root 4096 août 1 16:09 tmp sys_temp_dir = "/var/tmp"
# Ressource complémentaire concernant la fonction sys-get-temp-dir (Et non pas la directive sys_temp_dir) : https://www.php.net/manual/en/function.sys-get-temp-dir.php # La valeur de retour de sys_get_temp_dir() peut être définie globalement avec PHP depuis son fichier de configuration /etc/php/7.3/fpm/php.ini et de la directive "sys_temp_dir". # Elle peut également être définie pour un répertoire avec la configuration : php_admin_value sys_temp_dir /path/to/tmp
# Cette fonction ne prend pas en compte les modifications spécifiques du VirtualHost. # Depuis un système Linux, cette fonction renverra simplement "/tmp", et non le vrai chemin. # <Virtualhost> # php_admin_value open_basedir /home/user # php_admin_value upload_tmp_dir /home/user/tmp # php_admin_value session.save_path /home/user/tmp # </Virtualhost>
### # Pas certain ! # Les fichiers ajoutés dans /tmp par cette directive pourraient être les fichiers de session. ###
upload_max_filesize et post_max_size
# Il est bon de désactiver le système d'envoi de fichiers si vous n'utilisez pas de formulaires pour l'envoi de fichiers. # Pour être totalement certain qu’aucun upload ne pourra être fait par quiconque y compris par vous. # On peut également créer un fichier php.ini à la racine de son site et y inclure cette ligne. file_uploads = Off
# Avec ce genre de formulaire, il faut limiter un répertoire d'envoi avec la directive upload_tmp_dir et une taille maximale : # Les deux directives doivent avoir les mêmes valeurs. upload_max_filesize = 32M post_max_size = 32M
upload_tmp_dir
# Répertoire temporaire utilisé pour stocker les fichiers lors du téléchargement de fichier. # Doit être accessible en écriture par n'importe quel utilisateur PHP exécuté. # Si non spécifié, PHP utilisera les valeurs par défaut du système.
; Définit le répertoire temporaire utilisé pour stocker les fichiers lors du téléchargement de fichier : ; upload_tmp_dir="/var/lib/php/session" upload_tmp_dir="/var/www/tmp_php"
Avertissement Joomla - Le répertoire temporaire n'est pas défini
Configurer cette directive permet de résoudre le message d'erreur de Joomla depuis Extensions/Gérer/Avertissements : Le répertoire temporaire PHP n'est pas défini.
Les solutions qui n'ont pas fonctionnées sur mon VPS
Avec Debian Stretch et Apache2.4 :
- Créer un fichier php.ini dans le dossier principale contenant les fichiers du site. Ajouter la ou les lignes : upload_tmp_dir=/tmp
J'ai testé le chemin relatif et absolu, sans succès. Certains mutualisés acceptent le fichier php.ini et d'autres non. Je ne sais pas si le fichier php.ini est bien accepté avec ma configuration pour le VPS ou si je dois ajouter une ligne de commande pour permettre la prise en compte d'un fichier php.ini ajouté dans le site. Je laisse tomber cette solution.
- Ajouter une ligne dans le virtualhost # Cette configuration m'empêche de redémarrer Apache2 : <Directory /var/www/domaine.ext> php_admin_value upload_tmp_dir /tmp </Directory>
# Utiliser alors : SetEnv PHP_ADMIN_VALUE "upload_tmp_dir=/var/www/tmp"
- Même principe avec le fichier .htaccess mais je n'ai pas testé, avec la ligne précédente qui ne fonctionnait pas depuis le VirtualHost. - Il devrait être également possible de charger le fichier php.ini depuis le dossier local avec le fichier .htaccess mais je n'ai pas cherché a le faire.
La solution qui fonctionne sur mon VPS
Avec Debian Stretch et Apache2.4 :
# Créer le dossier "tmp" dans "/var/www/" : # Vérifier les droits attribués, ou encore, le bon emplacement de ce répertoire sur le système, même si le résultat semble fonctionnel. cd /var/www sudo mkdir tmp sudo chown www-data:www-data -R tmp/ # sudo chmod 755 -R tmp/ # Préférer la commande suivante ?! sudo chmod 1700 -R tmp/
# Commencer par configurer PHP 7.2 et Apache2 avec le fichier php.ini sudo nano /etc/php/7.2/apache2/php.ini
Modifier les valeurs suivantes : upload_tmp_dir = /var/www/tmp Vérifier que les deux lignes suivantes, les paramètres peuvent varier, mais ils doivent tous deux avoir la même valeur. upload_max_filesize = 32M post_max_size = 32M
Redémarrer Apache2. L'erreur est toujours affichée : Le répertoire temporaire PHP n'est pas défini sudo systemctl restart apache2
Dans mon cas, j'ai activé PHP FPM, donc, c'est la version du php.ini de FPM qui doit être configurée. sudo nano /etc/php/7.3/fpm/php.ini
Modifier à nouveau les valeurs suivantes : upload_tmp_dir = /var/www/tmp Vérifier que les deux lignes suivantes, les paramètres peuvent varier, mais ils doivent tous deux avoir la même valeur. upload_max_filesize = 32M post_max_size = 32M
Redémarrer Apache2 et PHP FPM : sudo systemctl restart apache2 sudo service php7.2-fpm restart
Résolu. Le message " Le répertoire temporaire PHP n'est pas défini " n'est plus affichée dans Joomla.
Différence entre /var/tmp et /tmp
Les répertoires /tmp et /var/tmp servent tous les deux à stocker des fichiers temporaires, mais leur utilisation est légèrement différente. La principale différence entre les deux réside dans leur période de conservation des données. Selon “pathname.com“, les données stockées dans /var/tmp sont plus persistantes que les données dans / tmp.
Par défaut, les données conservées dans /tmp sont conservées pendant 10 jours, contre 30 jours pour /var/tmp. C'est la principale différence entre ces deux. De plus, le contenu temporaire du programme dans / tmp est effacé après le redémarrage.
Quand un programme écrit des fichiers temporaires dans /tmp, il ne doit pas s'attendre à les retrouver d'un lancement de programme à l'autre. En effet ce répertoire peut-être purgé n'importe quand. Dans la vaste majorité des distributions, ce répertoire est nettoyé à chaque redémarrage.
Les fichiers écrits dans /var/tmp seront conservés après redémarrage.
user_ini.filename - Utiliser un .user.ini dans un seul répertoire
# Activer la directive depuis le fichier php.ini de PHP (Pour PHP7.3 FPM : "/etc/php/7.3/fpm/php.ini".) : user_ini.filename = ".user.ini"
# Vérifier que les directives peuvent être appliquées dans le fichier .user.ini depuis la colonne "Changeable" de la liste des directives : https://www.php.net/manual/en/ini.list.php # Une directive à garder à l'esprit est la "user_ini.filename_ttl". Cette directive établit la fréquence à laquelle le fichier .user.ini est vérifié pour les modifications. # En fonction de la fréquence à laquelle cette directive est définie, les modifications apportées à PHP peuvent rencontrer un léger délai avant d'être implémentées.
# Exemple d'utilisation de .user.ini pour modifier les valeurs suivantes depuis le site : # upload_max_filesize = 32M # post_max_size = 32M
# On peut lire depuis la liste des directives de PHP : " upload_tmp_dir NULL PHP_INI_SYSTEM ". # La valeur de cette directive ne peut donc pas être modifiée depuis .user.ini mais uniquement avec la configuration globale de PHP depuis son php.ini principal. # upload_tmp_dir=/tmp
Modules PHP
Il est conseillé de minimiser les modules utilisés pour des raisons de performances et de sécurité. Supprimer ou renommer les fichiers des modules pour cela :
# Exemple : sudo rm /etc/php.d/sqlite3.ini sudo mv /etc/php.d/sqlite3.ini /etc/php.d/sqlite3.disable
Les autres modules compilés ne peuvent être supprimés qu'en réinstallant PHP avec une configuration réduite. Télécharger le code source php à partir de php.net et le compiler comme suit avec le support de GD, fastcgi et MySQL
./configure --with-libdir=lib64 --with-gd --with-mysql --prefix=/usr --exec-prefix=/usr \ --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share \ --includedir=/usr/include --libexecdir=/usr/libexec --localstatedir=/var \ --sharedstatedir=/usr/com --mandir=/usr/share/man --infodir=/usr/share/info \ --cache-file=../config.cache --with-config-file-path=/etc \ --with-config-file-scan-dir=/etc/php.d --enable-fastcgi \ --enable-force-cgi-redirect
Afficher la liste des modules PHP
php -m
Module MySQL pour PHP
php7.0-mysql : https://packages.debian.org/sid/php7.0-mysql
Module de support de ZIP natif
# Depuis php7.0 il semble qu'il ne soit plus nécessaire de charger le module depuis le php.ini.
; Installer le paquet php-zip sur Debian va également installer le paquet php7.0-zip. ; Ajouter la ligne suivante dans le fichier php.ini ; extension=zip.so
mod_fastcgi
Cet technique n'a pas été testée mais la méthode proposée semble accessible.
Utilisateur PHP et ID de groupe : mod_fastcgi est un module cgi pour le serveur Web Apache. Il peut se connecter à un serveur FASTCGI externe. Vous devez vous assurer que php s'exécute en tant qu'utilisateur non root. Si PHP s'exécute en tant qu'utilisateur root ou utilisateur inférieur à 100, il peut accéder et / ou manipuler des fichiers système. Vous devez exécuter les CGI PHP en tant qu’utilisateur non privilégié à l’aide de suEXEC ou mod_suPHP d’Apache. La fonctionnalité suEXEC offre aux utilisateurs Apache la possibilité d'exécuter des programmes CGI sous des ID utilisateur différents de ceux du serveur Web appelant. Bonnes pratiques : php-cgi s'exécute en tant qu'utilisateur phpcgi et apache s'exécute en tant qu'utilisateur apache.
Ajouter un utilisateur phpcgi au système : https://www.cyberciti.biz/faq/howto-linux-add-user-to-group/ spawn-fcgi -a 127.0.0.1 -p 9000 -u phpcgi -g phpcgi -f /usr/bin/php-cgi
Utiliser un outil tel que spawn-fcgi pour générer des processus FastCGI locaux et distants en tant qu'utilisateur phpcgi : https://www.cyberciti.biz/faq/freebsd-configure-nginx-php-fastcgi-server/
Variables Environnement Serveur
Source : http://www.creation-site.org/variables-environnement.html
Whois en PHP
Source : https://github.com/phpWhois/phpWhois
Moteur de template
Twig
Moteur de template par défaut de Symfony et sert de langage de template pour Drupal. Disponible également pour de nombreux frameworks PHP dont Symfony, CodeIgniter, Laravel et Zend Framework. Licence BSD.
Site officiel : https://twig.symfony.com
Smarty
Disponible pour de nombreux frameworks PHP dont Symfony, CodeIgniter, Laravel et Zend Framework ce qui facilitera la reprise des templates existants. Licence LGPL.
Site officiel : https://www.smarty.net
https://github.com/ytake/Laravel.Smarty https://github.com/noiselabs/SmartyBundle http://www.coolphptools.com/codeigniter-smarty
Framework
Un framework est prévu pour libérer les développeurs des aspects « bas niveau » pour leur permettre de se concentrer sur des aspects « métier ».
L’idée de base : Tout ce qui est bas niveau et commun à tous les sites peut-être fait une fois pour toute puis réutilisé pour tout le monde : Accès base de données, routage de requêtes, cache, gestion d’utilisateurs, moteurs de rendu...
Certains frameworks sont pensés pour faciliter la distinction entre le contrôleur pour le code de traitement, le template pour l’affichage HTML et le modèle pour l’accès aux données. Cette approche Modèle Vue Contrôle n’est pas une obligation, même avec les gros frameworks, mais est malgré tout une bonne pratique. Le MVC est aujourd’hui un « standard » dans le développement d’applications Web.
Sécurité avec PHP
PhpSecInfo
PhpSecInfo fournit un équivalent de la fonction phpinfo () qui rapporte des informations de sécurité sur l'environnement PHP et offre des suggestions d'amélioration. PhpSecInfo ne remplace pas les techniques de développement sécurisées et ne fait aucun audit de code ou d'application, mais, il peut constituer un outil utile dans une approche de sécurité multicouche.
Le site officiel de 2012 pour PhpSecInfo : http://phpsec.org/projects/phpsecinfo/index.html Guide de sécurité du projet PHPsec : http://phpsec.org/projects/guide/
Télécharger PhpSecInfo
Le programme officiel mis à disposition sur PhpSecInfo n'est plus maintenu depuis 2007. Il est tout de même fonctionnel / partiellement fonctionnel sur un environnement Apache 2.4 avec PHP 7.3.
Ajout de toutes les versions dans le même projet Github sur le dépôt PhpSecInfo de ZerooCool
# Le dépôt Github de Zer00CooL pour PhpSecInfo reprend les 4 versions présentées ci-dessous : https://github.com/ZerooCool/phpsecinfo # La version de PhpSecInfo proposée par Zer00CooL en 2019 reprend les correctifs des versions précédentes : https://github.com/ZerooCool/phpsecinfo/tree/phpsecinfo-zeroocool-v0.2.1
1 - Version 2007 Le lien officiel pour télécharger la version de PhpSecInfo de 2007 v0.2.1 : http://phpsec.org/projects/phpsecinfo/phpsecinfo.zip
2 - Version 2007 vers 2009 Le lien officiel pour télécharger la version de PhpSecInfo de 2009 v0.2.2 : https://github.com/funkatron/phpsecinfo - https://github.com/funkatron/phpsecinfo/blob/master/CHANGELOG
3 - Version 2007 vers 2016 Le travail de mise à jour suivant ne semble pas avoir pris en compte les précédentes mises à jour de 2009. Le lien non officiel pour télécharger la version de PhpSecInfo de 2009 v2.0.1a -> v2.0.2 de 2016 : https://github.com/bigdeej/PhpSecInfo - https://github.com/bigdeej/PhpSecInfo/blob/master/CHANGELOG
4 - Version 2007 ou 2009 vers 2019 Un fork de PhpSecInfo vers SecurityInfo. Cette version semble être basée sur la v0.2.2 2009. Le CHANGELOG n'est plus présent pour suivre l'évolution des correctifs de ce projet. https://github.com/matomo-org/plugin-SecurityInfo/blob/master/PhpSecInfo/PhpSecInfo.php#L20 Cette mise à jour ne prend pas en compte les mises à jour de la v2.0.1a -> v2.0.2 de 2016. Le lien officiel pour télécharger la version de SecurityInfo de 2019 : https://github.com/matomo-org/plugin-SecurityInfo
Installer PhpSecInfo Version 2007 v0.2.1 depuis le site officiel
1- Télécharger PhpSecInfo depuis le site officiel : sudo wget http://phpsec.org/projects/phpsecinfo/phpsecinfo.zip
2- Renommer le dossier : sudo mv phpsecinfo-20070406 phpsecinfo
3- Ajouter un fichier .htaccess pour ne pas rendre le rendu de PhpSecInfo public : cd phpsecinfo sudo bash -c "cat <<EOIPFW >> .htaccess # Accès réservé à l'administrateur ! # Adresse IP de l'administrateur : Require ip xx.xx.xxx.xx EOIPFW"
4- Protéger le fichier .htaccess : sudo chmod 440 .htaccess ou sudo chmod 444 .htaccess
5- Changer le propriétaire du dossier phpsecinfo pour permettre l'affichage depuis le navigateur : cd .. sudo chown www-data:www-data -R phpsecinfo
6- L'administrateur peut maintenant consulter le rapport de phpsecinfo : https://www.visionduweb.fr/phpsecinfo/
Installer PhpSecInfo Version 2019 v3.0.1 depuis le site officiel
Les issues suivantes doivent être traitées : https://github.com/ZerooCool/phpsecinfo/issues Télécharger la version 3.0.1 : https://github.com/ZerooCool/phpsecinfo/tree/phpsecinfo-zeroocool-v3.0.1
La version 3.0.1 doit encore inclure la version officielle de 2009/2012 et la version de 2018 de Matomo.
Backdoor - Attention aux portes dérobées
Définition de la porte dérobée
Vous pouvez rencontrer des scripts PHP ou des backdoors classiques tels que c99, c99madshell, r57... Un script PHP de porte dérobée est un script caché qui permet de contourner toute authentification et d'accéder au serveur. Il est installé par un attaquant pour accéder au serveur tout en essayant de ne pas être détecté.
Généralement, un script PHP ou tout autre script CGI permet l’inclusion de code exploitant des vulnérabilités depuis le navigateur Web. Un attaquant peut utiliser ces vulnérabilités pour télécharger des scripts shells lui apportant un certain nombre de possibilités :
Download files Upload files Install rootkits Set a spam mail servers / relay server Set a proxy server to hide tracks Take control of server Take control of database server Steal all information Delete all information and database Open TCP / UDP ports and much more
Rechercher une porte dérobée en PHP
Utiliser la commande Unix / Linux grep pour rechercher dans le shell c99 ou r57: # grep -iR 'c99' /var/www/html/ # grep -iR 'r57' /var/www/html/ # find /var/www/html/ -name \*.php -type f -print0 | xargs -0 grep c99 # grep -RPn "(passthru|shell_exec|system|base64_decode|fopen|fclose|eval)" /var/www/html/
Tous les shell backdoor php sont de grande taille. Utilisez ce qui suit pour le trouver : find / -name "*.php" -type f -size +10000k -exec ls -lh {} ; | awk '{ print $9 ": " $5 }' find /var/www -name "*.php" -type f -size +10000k -exec ls -lh {} ; | awk '{ print $9 ": " $5 }'
PHPIDS - Un script IDS pour PHP
PHPIDS (PHP-Intrusion Detection System) est une couche de sécurité simple à utiliser, bien structurée, rapide et à la pointe de la technologie pour votre application Web basée sur PHP.
Source : https://github.com/PHPIDS/PHPIDS
Protéger un serveur PHP avec Suhosin
https://suhosin.org/stories/index.html https://www.cyberciti.biz/faq/rhel-linux-install-suhosin-php-protection/ http://www.web-d.be/post/88/prot%C3%A9ger-un-serveur-php-avec-suhosin.html
Bibliographie
Programmer en PHP.
PHP FPM
Apache HTTPD 2.4 : Mettre en place PHP-FPM FastCGI avec PHP 7 : https://www.security-helpzone.com/2017/03/11/apache-httpd-2-4-mettre-en-place-php-fpm-fastcgi-avec-php-7/
PHP multi-versions sur le même serveur Apache
Source : http://www.pulsar-informatique.com/actus-blog/entry/php-multi-versions-sur-le-meme-apache
SuPHP
SuPHP n'est plus maintenu depuis 2013 : http://www.suphp.org/Home.html SuPHP n’est plus disponible pour Debian 9, les fonctions de SuPHP sont obsolètes et seront également supprimées d’ISPConfig. Utiliser les modes PHP disponibles PHP-FPM ou PHP-FCGI avec suexec pour remplacer SuPHP.
Sécurité avec PHP
Linux 25 PHP Security Best Practices For Sys Admins : https://www.cyberciti.biz/tips/php-security-best-practices-tutorial.html Sécurité pour PHP : https://www.php.net/manual/fr/security.php
Codes sources et scripts PHP
Scripts complets et codes sources PHP / MySQL : https://phpsources.net
NAVIGATION
PARTICIPER ET PARTAGERBienvenue sur le wiki de Amis SH. De nombreuses pages sont partagées sur ce wiki. Créer un compte utilisateur pour participer sur le wiki. Les pages présentées sur le wiki évoluent tous les jours. Certaines recherches sont peu abouties et incluent des erreurs. Utiliser la recherche interne du wiki pour trouver votre contenu. La page de discussion de Amis SH vous permet de poser vos questions. Consulter le site amis-sh.fr pour installer votre propre serveur web. Améliorer le contenu des pages avec vos retours depuis l'onglet discussion. Ce contenu ne doit pas servir à nuire à autrui ou à un système informatique. Protéger votre système Linux ou Windows avec cette page dédiée à la sécurité. |
SOUTENIR CE WIKISoutenir le wiki avec un don en monnaie numérique : AEON - Bitcoins - Bitcoins Cash - Bitcoins Gold - Bitcore - Blackcoins - Basic Attention Token - Bytecoins - Clams - Dash - Monero - Dogecoins - Ğ1 - Ethereum - Ethereum Classique - Litecoins - Potcoins - Solarcoins - Zcash OBTENIR DE LA MONNAIE NUMERIQUEObtenir gratuitement de la monnaie numérique : Miner de la cryptomonnaie. |