Outils pour utilisateurs

Outils du site


php

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/

  1. yum install centos-release-scl
  2. yum install rh-php56
  3. scl enable rh-php56
  4. yum list rh-php56\*

Les rpm de remi ont le mérite de proposer une solution KISS, mais remplacent les paquets officiels

yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum install yum-utils
yum-config-manager --enable remi-php56
yum update

Voir aussi: http://rpms.remirepo.net/wizard/

paramétrage

Directive 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_INI_USER (ini_set() )
  • PHP_INI_PERDIR ( htaccess, httpd.conf, php.ini)
  • PHP_INI_SYSTEM ( httpd.conf, php.ini )
  • 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

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

phpcgi vs. 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:

  • 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 cgi, fcgi et en module

benchmark avec ab, sur mon portable (n=10000 et c = {10,20}), en requête par seconde

phppage statiquepage dynamique simplepage dynamique phpinfo
cgi 560 17 12
fcgid560370114
dso 700 540 150

Apc

cache de bytecode

yum install php-pecl-apc

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 /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

  • contrôle des sources
  • ne développez pas, réutilisez, adaptéz
  • Utilisation des frameworks
  • Norme de codage →codesniffer / php_beautifier
  • test (unitaires)
  • documentation
    • d'api - docblocks + doxygen / 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 netbeans 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.

Il s'appuie sur l'ORM doctrine ou propel.

Les paquets, même pour 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:

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

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:

   if( is_set( $_SESSION["email"]))

mais cette méthode est vulnérable à des attaques par vol de session

Pour renforcer la sécurité on peut:

  1. rajouter un timeout
  2. 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)