Configuration PHP

Qu'est ce que PHP ?

PHP (venant de l'acronyme récursif PHP: Hypertext Preprocessor), est un langage de scripts libre principalement utilisé pour être exécuté par un serveur Web.

PHP est un langage procédural disposant en version 5 de fonctionnalités de modèle objet complètes. En raison de la richesse de sa bibliothèque, on désigne parfois PHP comme une plate-forme plus qu'un simple langage. (Définition de wikipédia)

Configuration de PHP

“phpinfo()” est une fonction du langage PHP, elle permet de connaître les modules activés, la configuration du serveur, les éventuelles restrictions et limitations ainsi que les paramètres de compilation du langage.

<?php
// Affichage des informations sur le PHP utilisé :
echo phpinfo();
?>

Vous pouvez consulter les différents PHPInfo de la plateforme de FranceServ Hébergement à cette adresse :

https://phpinfo.franceserv.fr/

FranceServ Hébergement propose à ses hébergés le choix entre les branches PHP 5.3, 5.4, 5.5, 5.6 et 7.0 dans leurs dernières versions respectives.

Il est possible de choisir la version de la branche du moteur de PHP pour chacun de ses sites internet à l'aide du gestionnaire de son site directement dans son interface de gestion.

Avec le connecteur suPHP (et non pas PHP-FPM qui est utilisé par défaut), il est également possible de définir cette version directement à l'aide du fichier .htaccess pour disposer différentes versions PHP sur un même site Internet :

Branche du moteur PHP Directive .htaccess
PHP 7.0.x SetEnv PHP_VER 7_0
PHP 5.6.x SetEnv PHP_VER 5_6
PHP 5.5.x (par défaut) SetEnv PHP_VER 5_5
PHP 5.4.x SetEnv PHP_VER 5_4
PHP 5.3.x SetEnv PHP_VER 5_3

Afficher/masquer les erreurs PHP

Toutes les éventuelles alertes et erreurs PHP provenant de vos sites sont cachées par défaut (pour les nouveaux sites crées à partir du 06/03/2012) pour ne pas gêner les hébergés qui ne savent pas les interpréter.

Souvent, ce sont des alertes sans conséquence mais où l’hébergé peut se retrouver perdu devant de tels messages.

De plus, dans un milieu de production, il est très souvent conseillé de les cacher. Vous pouvez les afficher à tout moment à l’aide de votre interface de gestion dans le gestionnaire de chacun de vos sites si vous souhaitez corriger vos développements PHP.

Cependant, depuis PHP 5.4.0, un nouveau type d'alerte est apparu : “Strict Standards”. Ce nouveau stype d'alerte est caché par défaut via la configuration du serveur. Sauf que les sites soucieux de cacher les alertes non significatives réécrivent cette configuration en omettant ce nouveau type (car ils ont été écrits avant la sortie de PHP 5.4.0), du coup, ils les affichent de nouveau.

Pour cacher toutes les alertes non significatives :

<?php
error_reporting( E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT );
?>

Ne changez pas systématiquement de version PHP lorsque vous avez ce genre de problème comme beaucoup le font, c'est idiot de se passer des améliorations PHP alors que bien souvent ce ne sont que des alertes et pas des erreurs.

Gérer les alertes et les erreurs PHP

Lorsqu'une ligne en rouge s'affiche sur son site, il faut respecter une procédure pour corriger le problème. Toutes les lignes rouges ne sont pas des erreurs, il y a des erreurs (Error) ainsi que des alertes (Warning) et suivant le type du problème, il ne faut pas effectuer la même chose pour corriger le souci.

  1. Si c'est un site :
  • clef en main (CMS etc …) : il faut vérifier s'il existe une mise à jour de son site et le mettre à jour pour tenté de le rendre entièrement compatible avec la dernière version de PHP
  • développé à la main : il faut vérifier que les fonctions PHP utilisées ne sont pas obsolètes/dépréciées et utiliser leurs fonctions équivalentes pour tenté de le rendre entièrement compatible avec la dernière version de PHP
  1. S'il y a encore des lignes rouge insérées dans le site, vérifier que ce ne sont que des alertes (Warning) et pas des erreurs (Error) :
  • si ce ne sont que des alertes, les cacher via le gestionnaire du site dans son interface de gestion
  • si ce sont des erreurs, changez de version de PHP à la version inférieure.

De temps en temps, répétez l'opération à partir du point 1 en affichant de nouveau les alertes et erreurs PHP et en basculant sur la dernière version de PHP si vous aviez changé de version pour tentez de rendre son site entièrement compatible avec la dernière version de PHP.

Comment utiliser les sessions ?

Les sessions sont un moyen pour conserver des informations pendant une visite.

Les sessions sont activées chez FranceServ Hébergement par défaut.

Vous n'avez pas à créer de répertoire pour vos sessions comme elles sont stockées au sein même du serveur. Vous pouvez y accéder à l'aide des fonctions sessions de PHP mais ne pouvez pas y accéder directement avec d'autres fonctions (fopen etc …)

Un exemple simple :

Créez un fichier start.php (attention a l'extension .php) contenant :

<?php
  session_start();
  session_register ("count");
  $count = 42;
  echo "On enregistre ".$count." <br>";
?>
  Pour aller a la page suivante, <A HREF="nextpage.php">cliquez ici</A>

Créez un fichier “nextpage.php” contenant :

<?php
  session_start();
  session_register("count");
  echo "La valeur précédente de count etait " . $count ."<br>";
?>

Téléchargez les fichiers dans votre espace FTP dans le dossier de votre site et faites un test en appelant l'URL correspondante de start.php

Répertoire Racine (DocumentRoot)

Il est primordial de ne jamais utiliser de chemin absolu codé en ‘dur’, car le chemin est susceptible de changer et votre site serait alors inaccessible.

Aussi, vous pouvez(devez) utiliser la variable $_SERVER['DOCUMENT_ROOT'] qui pointe a la racine du site Web dans lequel se trouve votre script, vous serez donc sur de ne jamais avoir de déconvenues.

Exemple : Vous voulez savoir quel est le chemin correspondant a http://www.monsite.ext/unrepertoire/unautrerepertoire/

Il s’agit de $chemin = $_SERVER['DOCUMENT_ROOT'].“/unrepertoire/unautrerepertoire/”;

Connexion à une base de donnée

Les connexions persistantes ne sont pas possibles du fait de l’architecture et sont effectuées en tant que connexion standard.

Temps d’exécution maximum d'un script PHP

Le temps d’exécution maximum d'un script PHP est soit de 3 minutes pour l'offre gratuite, de 6 minutes pour l'offre Standard et de 12 minutes pour l'offre Pro.

La fonction set_time_limit() de PHP ne figure pas/plus parmi les fonctions interdites car elle était trop souvent utilisée à tort afin de définir un temps d’exécution maximum illimité.

Lorsque le temps d’exécution maximum d'un script PHP était redéfinie à l'aide de cette fonction, une alerte apparaissait et beaucoup d'hébergés pensaient y voir soit une erreur (alors que c'était une alerte) ou une limitation (alors que 3 minutes c'est largement suffisant pour un un site web).

Même si cette fonction n'est plus interdite, n’espérez pas non plus faire fonctionner un script PHP pendant plus de votre temps accordé, un robot vérifie et termine de force les scripts PHP excédant ce temps d’exécution maximum.

Uploader des fichiers

L'upload de fichiers via PHP est activé par défaut, la taille maximale d'un fichier pouvant être envoyé via PHP est de 32 Mo par défaut. Cette limite peut être rehaussée jusqu'à 400 Mo via le PHP personnalisé “.php.ini” à la racine de son site à l'aide des directives upload_max_filesize et post_max_size.

La principale source de piratage et de destruction d'un site Internet provient d'un formulaire d'envoi de fichiers non sécurisé.

Pour des raisons de sécurité, il faut veiller à ce qu'un script PHP ne puisse pas envoyer de fichier PHP car un internaute pourrai utiliser le formulaire d'envoi pour prendre le contrôle total de votre site.

C'est pour cette raison qu'il faut dans un premier temps, bloquer l’exécution de PHP éventuel dans le répertoire où sont envoyés les fichiers via PHP.

Soit en plaçant un fichier .htaccess dans le répertoire des envois :

<Files ^(*.php|*.phps)>
    order deny,allow
    deny from all
</Files>

Ou directement à la racine de votre site ce qui est plus sécurisé :

<Directory /home/httpd/d/e/m/demo/demo.franceserv.com/upload>
    <Files ^(*.php|*.phps)>
        order deny,allow
        deny from all
    </Files>
</Directory>

Il ne faut jamais permettre à votre script PHP d'envoyer des fichiers à la racine de votre site.

Vous devez renommer le fichier envoyé avec l'aide de la fonction move_updloaded_file avant la fin de votre script. Le fichier temporaire est effacé à la fin de l'envoi.

Voici un script PHP sécurisé pour permettre l'envoi de fichier image d'extension “.jpg”, de type mime “image/jpeg” et d'un poids inférieur à 350 Ko :

upload.php
<html>
<body>
  <form enctype="multipart/form-data" action="upload.php" method="post">
    <input type="hidden" name="MAX_FILE_SIZE" value="1000000" />
    Le fichier image : <input name="uploaded_file" type="file" />
    <input type="submit" value="Envoyer" />
  </form>
</body>
</html>
 
<?php
// On vérifie que le formulaire est envoyé.
if( isset($_POST['uploaded_file']) )
  {
  // On vérifie qu'il y a bien un fichier à envoyer et qu'il ne comporte pas d'erreur.
  if((!empty($_FILES["uploaded_file"])) && ($_FILES['uploaded_file']['error'] == 0))
    {
    // On pourrai récupérer le type mime du fichier envoyé mais un pirate peut
    // toujours modifier cette information en HTML. Dans la mesure où l'on
    // n'accepte que des images dans cet exemple, on va utiliser une fonction
    // PHP interne qui ne fonctionne qu'avec des images. Cette fonction est
    // sécurisée car elle est exécutée après l'envoi du fichier dans la zone
    // temporaire du serveur, il n'est alors plus possible de modifier les
    // propriétés du fichier pour tromper la mémoire interne.
    $upload_internal = getimagesize($_FILES['uploaded_file']['tmp_name']);
 
    // On récupère l'extension du fichier envoyé
    $filename = basename($_FILES['uploaded_file']['name']);
    $ext = substr($filename, strrpos($filename, '.') + 1);
 
    // On vérifie que :
    // 1) le fichier interne est une image,
    // 2) le type mime correspond à une image,
    // 3) l'extension du fichier est permise,
    // 4) le poid du fichier est inférieur à 350 Ko
    if ( ($upload_internal) && (substr($upload_internal['mime'], 0, 6) == 'image/') && ($ext == "jpg" | $ext == "jpeg" | $ext == "png") && ($_FILES["uploaded_file"]["size"] < 350000))
      {
      // On déterminer où sauvegarder le fichier final
      $newname = dirname(__FILE__).'/upload/'.$filename;
      // On vérifie que le fichier final n'a pas déjà été envoyé pour ne pas le remplacer
      if (!file_exists($newname))
        {
        // On tente de déplacer le fichier temporaire dans son empalcement final
        if ((move_uploaded_file($_FILES['uploaded_file']['tmp_name'], $newname)))
          {
          echo "Le fichier a bien été envoyé et se trouve à cet emplacement : ".$newname;
          } else {
          echo "Erreur : Il y a eu un problème lors de l'envoi du fichier !";
          }
        } else {
        echo "Erreur ! Le fichier ".$_FILES["uploaded_file"]["name"]." existe déjà !";
        }
      } else {
      echo "Erreur : Seules les images d'extensions .jpg/.jpeg/.png et inférieure à 350 Ko sont acceptées !";
      }
    } else {
    echo "Erreur : Il n'y a pas de fichier à envoyer !";
    }
  }
?>

Ce script PHP d'upload d'image est sécurisé car il ne fait pas confiance au navigateur qui lui indique que ce qui est envoyé est une image. Ni même si la première ligne de ce fichier contient un code qui indique que le fichier est une image. Car on ne peux pas être sûr si les lignes suivantes ce n'est pas un script PHP qui s'y cache.

Le script PHP vérifie alors la taille de la soit disante image se trouvant dans la zone temporaire d'upload avec la fonction PHP getimagesize(). Si la taille de l'image retournée est 0, ce n'est alors pas une image valide, mais très certainement un script PHP qui se fait passer pour une image en modifiant le type mime de son format à l'intérieur de son propre contenu.

Envoyer des emails

La fonction mail() de PHP est activée par défaut. Pour en savoir plus sur son utilisation, merci de consulter le lien suivant :

https://www.franceserv.fr/wiki/mail#envoyer_un_mail_depuis_son_site_avec_php

Pour information, la fonction mail renvoie TRUE en cas de succès et FALSE si le mail a été bloqué avant son envoi.

Soyez conscient qu'un individu malveillant peut profiter des formulaires de contact pour vous envoyer du spam. En l'appelant plusieurs fois par seconde, il va finir par saturer l'adresse mail que vous avez indiqué. L'ajout d'une procédure de type captcha peut vous aider à éviter ce genre de piratage, et donc la suspension ou l'annulation de votre compte.

Créer un formulaire de contact (form2mail)

Nous supposons dans cet exemple que le nom de domaine hébergé est “domaine.ext”.

Créer un fichier “form.html” que vous mettrez en ligne via FTP.

<html>
<body> 
<form action="form2mail.php" method="post">
Entrez votre adresse mail: <input type="text" name="email"><br>
Message:<br>
<textarea name="message" rows="8" cols="50"></textarea><br>
<input type="submit" value="Envoyer le mail">
</form> 
</body>
</html>

Créer un second fichier “form2mail.php” que vous mettrez en ligne via FTP.

<?php
 
/* Initialisation des variables */
$from = "webmaster@domaine.ext"; // l'expéditeur : remplacer ici domaine.ext par votre domaine
$to = "vous@domaine.ext"; // le destinataire : mettez ici votre adresse mail valide
 
/* Préparation */
$subject = "Test fonction mail() de PHP"; // le sujet du mail
$email = NULL;
$message = NULL;
 
/* Récupération du champs email */
if (!empty($_POST['email'])) {
  $email = $_POST['email'] ;
}
/* Récupération du champs message */
if ($email && !empty($_POST['message'])) {
  $message = "Message envoyé par $email :\n" . $_POST['message'];
}
 
/* Envoi*/
if ($email && $message)
{
 
  /* En-têtes obligatoires du message */
  $headers = "From: Webmaster <$from>\n";
  $headers .= "To: Contact <$to>\n";
/*  $headers .= "MIME-Version: 1.0\n";
  $headers .= "Content-type: text/plain; charset=iso-8859-15\n";
 
 /*  Appel a la fonction mail */
  if (!mail($to, $subject, $message, $headers)){
     echo "Erreur: Impossible d'envoyer le mail";
  } else {
     echo "Envoi réussi";
  }
} 
else {
  echo "Erreur: vous devez spécifier une adresse email valide et un texte\n";
}
 
?>

Quand vous transférez votre fichier .htaccess, vérifiez que le mode de transfert FTP est “TEXTE” et non pas “BINAIRE”, sinon vous aurez une erreur http 500.

Le safe mode n'est pas activé.

Astuce :

Remplacez la ligne :

echo "Envoi réussi";

par une ligne du style :

header("location: /envoi_reussi.html");

car en affichant uniquement un echo, le visiteur peut actualiser sa page à l'aide de la touche F5 pour envoyer le mail le nombre de fois qu'il actualise et flooder votre boite mail de contact.

chown

La modifications du propriétaire des fichiers est prohibé, les fichiers uploadés via PHP et/ou via FTP ont déjà votre utilisateur.

system / exec / popen

L'exécution de programme binaires, d'exécutables ou de cgi est prohibé pour des raisons de sécurité.

ASP/CGI

Pas d'asp, ni de cgi (cgi-bin), ni de programmes exécutables.

Liste des branches PHP

Branche Fin de vie Disponibilité Stabilité
7.0 3 Dec 2018 oui oui
5.6 31 Dec 2018 oui oui
5.5 10 Jul 2016 oui oui
5.4 3 Sep 2015 oui non
5.3 14 Aug 2014 oui non
4.4 7 Aug 2008 non non
 
php.txt · Dernière modification: 2016/07/03 15:38 par elodie
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki