PHP 5.4…

La vie c’est un peu comme une boite de chocolat : il y en a des bons, y’en a des pas bon, y’en a des alcoolisées, y’en a des tout doux, mais y’en aussi des obsolètes bourrés de failles de sécurité et que l’absence de ressources en ligne rend difficile à apprécier (oui bon d’accord je voulais tenter une l’analogie subtile avec PHP 5.4 mais j’ai craqué).
Petite présentation des ressources exploitables, orientées sécurités et outils utiles.

Comme évoqué avec un collègue, dans la vie, on peut être amené à travailler sur des projets PHP qui n’ont pas évolué en terme de version et donc travailler sur du PHP 5.4. Est-ce une décision de l’ESN pour désespérer un consultant et l’amener au suicide ? Est-ce une volonté divine de nous mettre à l’épreuve qui pousse à l’humilité tant les compétences à acquérir ne prodigueront aucune gloire à venir ? Est-ce le karma qui revient, tel un boomerang, nous punir d’avoir dit à un moment de notre vie que « le javascript c tro bien lol » ?
Nous ne savons pas, mais quoiqu’il en soit je vous propose d’attaquer le taureau par les cornes.

Les problèmes

Blague mise à part, PHP 5.4 présentent différents problème :

  • En tant que version sortie le 01/03/2012, il n’est plus supporté activement depuis le 14 Sep 2014 et il n’est plus maintenu depuis le 14/09/2015. Cela sous-entend que toutes les faille de sécurité découvertes (ou les méthode de hacking inventée) depuis le le 14/09/2015 sont susceptible de ne pas être corrigé.
  • Accéder à la documentation officielles en ligne propre à PHP 5.4 devient compliqué : bien que le site officiel indique pour chaque fonction la compatibilité avec la version de PHP, il n’est actuellement plus possible de consulter sur php.net l’aide PHP 5.4
  • Les tutoriels, cours, présentation, articles qui renseignent avec certitude une bonne pratique PHP 5.4 sont difficiles à trouver. Et il n’est pas rare qu’à part la date de l’article il ne soit quasiment impossible de s’assurer que ce qui est annoncé fonctionne bien sur PHP 5.4
  • Les frameworks et autres librairies modernes sont difficilement exploitables : en effet, s’ils utilisent des méthodes, structure de données ou mot-clés plus récent… ils ne seront pas utilisable pour un site en PHP 5.4

Documentations PHP 5.4.0

Heureusement il existe plusieurs moyen d’accéder à la documentation PHP 5.4.0 (en anglais). C’est jamais parfais, mais ça dépanne.

  1. https://durak.org/sean/pubs/software/php-5.4.6/
    Tout d’abord, je vous propose un site qui permet de naviguer dans l’arborescence de feu PHP 5.4.6 ; le seul hic c’est qu’il n’y a pas de champs de recherche disponible. De plus vous l’aurez compris, on accède à la documentation PHP 5.4.6 (mais bon, quand on vit à l’époque de PHP 8.1 et qu’on doit travailler sur 5.4, on est pas à 6 versions mineurs près hein !)
  2. http://doc.php.net/archives/php5/
    Ensuite, vous pourrez trouver une archive au format gz (gzip, ouvrable avec 7zip par exemple) qui contient la documentation en anglais, sur UNE PAGE HTML DE 64MO (Tout Va Bien) sur le site officiel de php.net. Je vous conseille de la télécharger, de la mettre sur une clé USB et de brûler ladite clé.
  3. https://php-legacy-docs.zend.com/manual/php5/en/index
    Théoriquement, vous devriez pouvoir utiliser ce site qui recense les versions de PHP (ici la 5). Toutefois je vous mets en garde : le champs de recherche bien que présent ne fonctionne pas et la langue non plus.

Le début du commencement

Tout d’abord une première étape utile, pour vos tests et autres tentatives d’invocation de Satan, télécharger PHP 5.4.45.

En effet, ce n’est pas PHP 5.4.0 car elle n’est plus disponible au téléchargement (le serveur a probablement été immolé ou enterré au niveau du 5ème cercle de l’enfer) ; seule la dernière release 5.4.45 l’est encore. Petit vénard que nous sommes…

De mon côté je n’ai pas réussi à faire fonctionné en local sur MAMP PHP dans une version inférieur à 5.5.38. Si vous y arrivez bravo donc.

Moi, dépité

Attention

Des habitudes de codage seront peut-être à « éviter » tant PHP à évoluer. Il il faut savoir que dans cette version de PHP :

  1. la précision du type de retour d’une fonction n’existe pas.
    Impossible donc d’écrire function GetName() : string {//…}, ça ne sera pas comprit.

Tutoriels et vidéos

J’ai arrêté rapidement l’archéologie concernant PHP 5.4, en partie car je suis en télétravail et qu’il y a trop d’objet contondants, tranchants et autre façon de mettre fin à mes jours autour de moi.

Je vous conseille toutefois les tutoriels vidéos de saint (parce qu’il appartient à une autre époque) focuslogik : https://www.youtube.com/channel/UCPGnNIRJCFlhT2zEzOTZ37w

Cela va de l’installation d’un environnement serveur en local avec WAMP (ça rajeunit pas), jusqu’à des notions avancées de sécurité en partant des concepts de bases. Prenez toutefois un café (ou 15) et tentez un fond sonore entre électro-house, techno des années 90 ou un trip psy-trance pour rester éveiller car le rythme est caaaaaaaalme (mais, du coup, très facile à aborder).

Frameworks et outils PHP 5.4

Vous pouvez utiliser le framework Symfony jusqu’à la version 2.8. En effet, pour une version ultérieur il vous faudrait une version PHP 5.5.9 pour profiter d’une expérience plus récente. Bien sûr, vous « pouvez » mais il ne faudrait pas le faire pour des projets professionnelles car cette version n’est plus maintenu et pourra donc comporter des failles de sécurité.

Concernant le framework Laravel, il est utilisable jusqu’à sa version 5.0. Mais attention ! (Oui : attention !). Car la version 5.0 de laravel n’est compatible que de PHP 5.4.0 jusqu’à PHP 7.1. Tandis que la version 4.2 de Laravel est compatible avec PHP 5.4 et supérieurs !
Ce qui veut dire que si vous prévoyez de migrer votre projet en PHP 8.1 prochainement, privilégier peut-être la version 4.2.

Côté sécurité, le Framework PHPIDS (PHP-Intrusion Detection Systeme) qui permet de programmer des comportement (envoi de mail, redirection, déconnexion, log…) lors d’une détection d’intrusion est compatible avec PHP 5.4 comme le mentionne leur wiki. Toutefois il semble que la compatibilité ne perdure pas après 5.4, nous aurons donc ici l’exclusivité du framework. Vive nous. Vive PHP 5.4.

Le 27/04/2015 (soit quelques mois avant la « mort » de php 5.4) cet article lista 9 autres framework de sécurité : PHP Password Lib, phpseclib et TCrypto (librairies cryptographiques PHP5.4, PHP 4+ et PHP 5.3+) ; HTML Purifier (qui retirerait le code malicieux…) URLcrypt (pour assurer le chiffrement symétique AES 256-bit des données en URL) hybridAuth (pour les authentification utilisant les compte Facebook, LinkedIn, Google etc.) et les 3 derniers : Security Check – Sensiolabs pour auditer votre site niveau sécurité, PHP Login Project pour gérer l’authentification et enfin SecurityMultiTool qui a l’air d’un truc assez monstrueux en termes de fonctionnalité.

Les bonnes nouvelles

Car tout n’est pas perdu. Car il y a encore un espoir. Car les Avengers existent quelques part dans nos cœurs : voici des éléments utilisable sur PHP 5.4 qui assureront des bases en terme de sécurité.

La POO

Voici, avec un exemple de base, comment une classe PHP s’écrit en PHP 5.4.0 (ça n’a peut-être pas évoluer, je saurais pas dire) : déclaration & initialisation, méthodes statique, héritage…

<?php 

$object = new ObjectClass("value");
echo $objet->ReturnSomething();

echo ObjectClass::DoSomethingStatic();

interface ParentInterface{
   public function DoSomething();
}

class ParentClass implements ParentInterface
{
   protected $_parentvalue='';

   public function ShowSomething()
   {
      return "Value from parent";
   }

   public function DoSomething(){
      return "Ok";
   }

   public Get
}

class ObjectClass extends ParentClass
{
   private $_privateValue = '';   

   function __construct($value)
   {
      $this->_privateValue = $value;
   }
   
   public function ShowSomething()
   {
      $response = '';
      $response .= parent::ShowSomething();
      $response = $this->DoSomething($this->_url);

      return $response;
   }

   public function returnSomething(){
      return "value";
   }

   private function DoSomething($value){
      return $value;
   }

   public static function ShowSomethingStatic($value){
      return $value;
   }
}

Hashage + Salage

La méthode password_hash() est utilisable avec un sel custom qui plus est ! En effet l’option d’un sel personnalisé a été retiré par la suite (PHP considérant que cela pouvait crée une faille de sécurité en cas de sel trop peu sécurisé). Il est donc conseillé d’en créer un solide via une méthode type random_bytes.

A ce sujet, random_bytes() n’étant pas disponible, la librairie utilisateur random_compat() prend le relai de PHP 5.2->5.6. Elle est d’ailleurs conseillée via la documentation officielle. Une fois inclue, le hashage et salage du mot de passe s’opère ainsi :

<?php
require_once "Includes/random_compat-2.0.21/lib/random.php";

$password_string = "MotDePasse$3cùRïs3";
$options=array(
   'salt'=>random_bytes(699326,MCRYPT_DEV_URANDOM),
   'cost'=>12,
);
$password_hash=password_hash($password_string,PASSWORD_BCRYPT,$options);
echo $password_hash;

echo "<br/>";

if ( password_verify( $password_string, $password_hash ) )
    echo "Password correct";
?>

En vrac

Voici une liste de méthode PHP utilisable en PHP 5.4 qui aideront à la sécurité :

  • PDO, PHP Data Object est utilisable !
    Disponible à partir de PHP 5.1, la joie de préparer une requête SQL dans les règle de l’art est donc à porter de tous. Attention toutefois : doit être présent au niveau serveur un driver PDO spécifique à la base de donnée.
  • filter_var($dirtyAddress, FILTER_SANITIZE_EMAIL) : string;
    Cette dernière, dans ce cas précis, retournera une adresse email nettoyé de tout caractère incompatible avec une vraie adresse mail (« pr¤ographïie@gmail/;.cÔom » sera retourné « [email protected] »). D’autre filtres existes.
  • strip_tags() et addSlashs()
    Pour retirer les tags javascript/html ou ajouter des anti-slash afin d’échapper des caractères, ces deux méthodes sont dispo en PHP 5.4 bien que strip_tags() ait un peu évolué en 7.4 et 8.0.
  • htmlentities() / htmlspecialchars()
    Convertissant les caractère éligibles dans un premier cas et caractère spéciaux dans le second, ces deux méthodes renverront leur équivalent html à tous les <,>,& et autres joyeusetés.
  • setcookie(string $name, string $value = «  », int $expires_or_options = 0, string $path = «  », string $domain = «  », bool $secure = false, bool $httponly = false): bool
    Présent uniquement dans cette signature (l’autre n’est possible qu’à partir de PHP 7.3) il est possible de respecter de bonne pratique de sécurité via cette méthode.
  • ctype_alnum(mixed $text): bool
    Qui indique si les caractère d’une chaine sont seulement alphanum (lettres et chiffre)
Sources

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *