Outils pour utilisateurs

Outils du site


php

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

php [2016/07/11 11:24] (Version actuelle)
Ligne 1: Ligne 1:
 +
 +====== PHP ======
 + ==== Généralités ==== 
 +
 +langage de programmation pour site dynamique
 +
 +libre
 +
 +langage interpreté
 +
 +très nombreux connecteur lui permettant de s'​interface avec d'​autres systèmes.
 +
 +Fortes références
 +
 +Coût de licence (: D) et de développement faible.
 +
 +Langage communautaire dynamique et un peu brouillon.
 +
 + ​==== ​ Architecture ====
 +
 +La machine virtuelle (zend engine) exécute le bytecode (opcode) généré par l'​interpréteur depuis le code. Il existe des outils permettant de mettre en cache cet opcode, de manière à optimiser son exécution.
 +
 + ​==== ​ installation ====
 +
 +Gestion des modules
 + via yum / apt
 + via pear
 +
 + === Installer une autre version ===
 +
 +Les //softwares collections//​ proposent des paquets compatibles RH / CentOS de bonne qualité
 +
 +Sauf que c'est un peu un gros bazar intrusif.
 +
 +L'​installation peut se faire en suivant les instructions présentes sur ce site:​https://​www.softwarecollections.org/​en/​scls/​rhscl/​rh-php56/​
 +
 +  - yum install centos-release-scl
 +  - yum install rh-php56
 +  - scl enable rh-php56
 +  - yum list rh-php56\*
 +
 +Les rpm de remi ont le mérite de proposer une solution KISS, mais //​remplacent//​ les paquets officiels
 +<​code>​
 +yum install http://​rpms.remirepo.net/​enterprise/​remi-release-7.rpm
 +yum install yum-utils
 +yum-config-manager --enable remi-php56
 +yum update
 +</​code>​
 +
 +Voir aussi: http://​rpms.remirepo.net/​wizard/​
 +
 +
 + ​==== ​ paramétrage ====
 +
 +Directive [[:​apache|apache]] //​PHPIniDir//​
 +
 +Possibilité d'​avoir des .ini dans un répertoire (fonctionnement similaire au .htaccess). Voir les directives //​user_ini.filename//​ et //​user_ini.cache_ttl//​
 +
 +L'​endroit où une directive peut être définie ou modifiée est définie par son //mode// :
 +  * [[:​php|PHP]]_INI_USER (ini_set() )
 +  * [[:​php|PHP]]_INI_PERDIR ( htaccess, httpd.conf, [[:​php|php]].ini)
 +  * [[:​php|PHP]]_INI_SYSTEM ( httpd.conf, [[:​php|php]].ini )
 +  * [[:​php|PHP]]_INI_ALL (partout )
 +# configuration globale et spécifique
 +
 + ​=== ​ php.ini === 
 +activation / désactivation des extensions
 +
 +__Directives obsolètes__
 +  * safe_mode
 +  * register_globals ​
 +  * magic_quotes_gpc
 +
 +  * open_basedir
 +  * max_execution_time
 +  * memory_limit
 +
 +__gestion des erreurs:__
 +  * error_reporting
 +  * display_errors
 +  * log_errors
 +
 +__session:​__
 +  * session.save_handler=file
 +
 + ​=== ​ configuration dans un script === 
 +  * ini_set( directive, valeur)
 +  * ini_get( directive )
 +
 + ​=== ​ configuration via apache === 
 +  * [[:​php|php]]_flag
 +  * [[:​php|php]]_value
 +  * [[:​php|php]]_admin_flag
 +
 + ​=== ​ session === 
 +  * session.name
 +  * session.auto_start=0
 +  * session.save_path
 +  * session.gc_maxlifetime
 +
 + ​=== ​ cache === 
 +type de cache:
 +   ​public
 +   ​private
 +   ​nocache
 +   none
 +  * session.cache_limiter : none
 +  * session.cache_expire:​ 180
 +
 + ​=== ​ considération sur la sécurité === 
 +  * upload_tmp_dir
 +  * validations des entrées utilisateur
 +
 + ​=== ​ CGI, CGID, Fast CGI et suExec === 
 +[[:​php|php]]cgi vs. [[:​php|php]] as a module : un rapide benchmark avec ab vaut mieux qu'un long discours
 +
 +( surtout avec un htop dans un coin )
 +
 + ​=== ​ Gestion des erreurs === 
 +
 +interception vs enregistrement.
 +
 +Erreur [[:​php|PHP]]:​
 +  * niveau
 +  * message
 +  * nom du script
 +  * n° de ligne en cours
 +
 +Attention aux fuites d'​information
 +
 + === Gestion d'​erreurs en mode développement: ​  ​=== ​
 +  * error_reporting = E_ALL | E_STRICT
 +  * display_errors = on
 +  * log_errors = on
 +  * error_log = /​var/​log/​httpd/​php.log
 +
 + === Gestion d'​erreur en mode production ​ === 
 +  * error_reporting = E_ALL
 +  * display_errors = **off**
 +  * log_errors = on
 +  * error_log = /​var/​log/​httpd/​php.log | syslog
 +  * ignore_repeated_errors
 +
 + ==== Performances comparées ====
 +entre [[apache.cgi|cgi]],​ [[apache.fastcgid|fcgi]] et en module
 +
 +benchmark avec ab, sur mon portable (n=10000 et c = {10,20}), en requête par seconde
 +^php^page statique^page dynamique simple^page dynamique //​phpinfo//​^
 +|cgi| 560 | 17 | 12 |
 +|fcgid|560|370|114|
 +|dso| 700 | 540 | 150 |
 +
 + ==== Apc ====
 +
 +cache de bytecode
 +
 +<​code>​
 +yum install php-pecl-apc
 +</​code>​
 +
 + === Configuration ===
 +
 +// /​etc/​php.d/​apc.ini //
 +
 +  * apc.shm_size
 +  * apc.file_update_protection
 +  * apc.stat = 0 en production
 +
 + === Visualisation ===
 +cp /​usr/​share/​doc/​php-pecl-apc-3.1.3p1/​apc.[[:​php|php]] /​var/​www/​html/​
 +
 +voir la page //apc.php//
 +
 +//Cache Full Count// doit être aussi bas que possible.
 +
 +==== Langage ====
 +
 +=== Variables et opérateurs ===
 +
 +== type de données ==
 +
 +== variables et constantes ==
 +
 +== variables tableau ==
 +
 +
 +==== Bonnes pratiques ====
 +  * [[:​netbeans|éditeur]]
 +  * contrôle des sources
 +  * ne développez pas, réutilisez,​ adaptéz
 +  * Utilisation des frameworks
 +  * Norme de codage ->​[[webcodesniffer|codesniffer]] / [[:​php|php]]_beautifier
 +  * test (unitaires)
 +  * documentation
 +    * d'api - docblocks + doxygen / [[:​php#​doc|phpdocumentor]]
 +    * d'​application
 +    * de déploiement
 +    * d'​exploitation
 +  * déploiement en plusieurs phase
 +
 +==== Environnement de test ====
 +
 +Installation et paramétrage de [[EasyPHP]]
 +
 +==== doc ====
 +
 +Utilisation des //​docblocks//​ et génération automatique de la documentation avec le plugin [[:​old:​netbeans|netbeans]] [[:​php|php]] documentor
 +
 +Documenter votre code:
 +  <​code>​
 +
 +Récupérer le dossier documentor.
 +
 +Configurer [[:​netbeans]] en donnant le chemin d'​accès vers le script //​phpdoc.bat//​
 +
 +Générer la documentation en faisant un clic-droit sur le projet -> générate dic
 +
 +==== Divers ====
 +
 +=== Demander à apache d'​afficher le code php plutôt que de l'​interpréter:​ ===
 +
 +Rajouter la directive:
 +  <​FilesMatch \.php>
 +     ​SetHandler application/​x-httpd-php-source
 +  </​FilesMatch>​
 +  ​
 + ==== Symfony ====
 +
 +framework MVC pour [[:​php|php]].
 +
 +Il s'​appuie sur l'ORM doctrine ou propel.
 +
 +Les paquets, même pour [[:​old:​debian|Debian]] SID semblent obsolète.
 +
 +La documentation est en français.
 +
 +Installation dans lib/vendor
 +
 +Génération du projet (option --orm=none)
 +
 +Génération de l'​application frontend
 +
 +Attention, le répertoire racine du projet ne doit pas être dans le DocumentRoot !
 +
 +Configurer [[:​apache|apache]]:​
 +<​code>​
 +<​VirtualHost 127.0.0.1:​8080>​
 +  DocumentRoot "/​home/​sfproject/​web"​
 +  DirectoryIndex index.php
 +  <​Directory "/​home/​sfproject/​web">​
 +    AllowOverride All
 +    Allow from All
 +  </​Directory>​
 +
 +  Alias /sf /​home/​sfproject/​lib/​vendor/​symfony/​data/​web/​sf
 +  <​Directory "/​home/​sfproject/​lib/​vendor/​symfony/​data/​web/​sf">​
 +    AllowOverride All
 +    Allow from All
 +  </​Directory>​
 +</​VirtualHost>​
 +</​code>​
 +
 +accès à la page de dev: http://​symfony/​frontend_dev.php/​
 +
 +==== Smarty ====
 +
 +Smarty coté template:
 +
 +   {* commentaire *}
 +
 +   ​{$variable} scalaire
 +   ​{$variable[O]} d'un tableau
 +   ​{$variable.bar} d'un tableau associatif.
 +   ​{appel arg1=value arg2=value} de fonction
 +   ​{#​variable#​} tirée d'un fichier de conf (récupéré via un ''​config_load ​ file='​fichier.conf'''​ )
 +
 +   ​Afficher la date: {$smarty.now|date_format:'​%d-%m-%Y %H:​%M:​%S'​}
 +
 +Bref c'est un modèle de simplicité permettant de vraiment séparer présentation et logique applicative.
 +
 +==== Sessions ====
 +
 +Attaque de type **fixation de session**:
 +
 +Dans ce type d'​attaque,​ c'est l'​attaquant qui définit l'id de session.
 +
 +Pour se protéger, il convient d'​implémenter les mêmes directives de la section suivante, et notamment:
 +
 +  * définir une durée de vie pour les sessions
 +  * régénérer l'​identifiant de session à chaque requête.
 +
 +On pourra également vérifier à chaque requête que celle-ci provient bien du même client (cela implique l'​enregistrement régulier de $_SERVER["​REMOTE_ADDR"​] et $_SERVER["​HTTP_USER_AGENT"​].
 +
 +La vérification de la session peut se faire de manière simple:
 +<​code>​
 +   if( is_set( $_SESSION["​email"​]))
 +</​code>​
 +
 +mais cette méthode est vulnérable à des attaques par vol de session
 +
 +Pour renforcer la sécurité on peut:
 +  - rajouter un timeout
 +  - rajouter un fingerprint sur $_SERVER['​REMOTE_ADDR'​] et $_SERVER['​HTTP_USER_AGENT'​]
 +# vim: set filetype=dokuwiki:​
  
php.txt · Dernière modification: 2016/07/11 11:24 (modification externe)