var Phenix = function () {
Troll du Web depuis 1996

PHP


Laravel : utiliser un trait php pour purifier le HTML d’un champ

Lorsque l’ont stock du HTML dans le champ d’une base de donnée, il ne faut jamais le stocker sans le filtrer. C’est une mauvaise pratique bien connue, cela attire les failles XSS et personne n’aime en avoir.

Bref, voici une méthode sympa pour protéger un champ.

Dans un premier temps il faut installer HTMLPurifier :

  1. composer require ezyang/htmlpurifier

Cette librairie permet de filtrer le html correctement. N’utilisez pas strip_tags, cette fonction n’est pas faite pour la sécurité.

Ma base de donnée contient assez bien de champs « description », ils risquent tous de contenir du HTML, car ils sont remplis par un CKeditor.

Cela affecte tous ces champs, j’ai envie de les protéger facilement.
J’ai donc créé un fichier ./app/traits/purify.php

On va mixer le pouvoir des mutators de Laravel et

  1. <?php
  2.  
  3. namespace App;
  4.  
  5. use HTMLPurifier_Config;
  6. use HTMLPurifier;
  7.  
  8. trait Purify
  9. {
  10.     /**
  11.      * @property $allowed allowed html inside description field
  12.      */
  13.     private $allowed = 'p, strong, h2, h3, a[href], ul, ol, li, i';
  14.  
  15.     /**
  16.      * Laravel mutator.
  17.      * Filter all unauthorized HTML from the description field
  18.      * @param $value
  19.      */
  20.     public function setDescriptionAttribute($value)
  21.     {
  22.         $config = HTMLPurifier_Config::createDefault();
  23.         $config->set('HTML.Allowed', $this->allowed);
  24.         $purifier = new HTMLPurifier($config);
  25.         $this->attributes['description'] = $purifier->purify($value);
  26.     }
  27. }

Il suffit alors d’utiliser ce trait dans un modèle Laravel pour que les champs description soit automatiquement filtrés avant d’être insérés dans la base de donnée !

  1. <?php
  2.  
  3. namespace App;
  4.  
  5. use Illuminate\Database\Eloquent\Model;
  6.  
  7. class MyModel extends Model
  8. {
  9.     use Purify;
  10. }

Laravel et PHP sont des outils vraiment formidables quand on comprend ce genre d’astuce !


Lire un fichier CSV avec Laravel

J’avais besoin de lire un fichier CSV pour remplir une base de donnée Laravel. C’est assez simple à faire car il y a une super lib pour gérer le CSV :

  1. composer require League/csv

On lit le CSV et on boucle sur chaque élément. Après on en fait ce qu’on veut :) !

  1. <?php
  2. use Illuminate\Database\Seeder;
  3. use Illuminate\Support\Collection;
  4. use Illuminate\Support\Facades\Log;
  5. use League\Csv\Reader;
  6. use League\Csv\Statement;
  7.  
  8. class commune extends Seeder
  9. {
  10.     /**
  11.      * Run the database seeds.
  12.      *
  13.      * @return void
  14.      */
  15.     public function run()
  16.     {
  17.         // Remplir la base de donnée avec les communes du fichier CSV
  18.  
  19.         // Lire le fichier csv
  20.         $csv = Reader::createFromPath(storage_path('app/communes_belges.csv'));
  21.         $csv->setHeaderOffset(0);
  22.  
  23.         // Boucler sur les données du fichier csv
  24.         $records = (new Statement())->process($csv);
  25.         foreach ($records->getRecords() as $record) {
  26.             var_dump($record);
  27.         }
  28.     }
  29. }


Éxecuter du code quand une commande est payée

Lorsque l’on utilise le plugin commande et que l’on souhaite exécuter une peu de code lorsqu’une commande est payée, il suffit d’utiliser ce petit pipeline :

  1. function prefixe_post_edition($flux) {
  2.         if ($flux['args']['table'] == table_objet_sql('commande')
  3.                 and $flux['args']['action'] == 'instituer'
  4.                 and $flux['args']['statut_ancien'] == 'encours'
  5.                 and $flux['data']['statut'] == 'paye'
  6.         ) {
  7.                 $id_commande = $flux['args']['id_objet'];
  8.                 // Coder ici
  9.         }
  10.         return $flux;
  11. }