Installer PHP

De Wiki Amis SH
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

cgi.force_redirect - Sécurité pour les adresses de navigation web

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

open_basedir - Limiter la navigation au système de fichiers du dossier contenant le ou les sites

# 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 PARTAGER

Bienvenue 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 WIKI

Soutenir 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 NUMERIQUE

Obtenir gratuitement de la monnaie numérique :
Miner de la cryptomonnaie.