Le View Cache eZ Publish n’est pas sans risque

L’utilisation des caches avec eZ Publish est obligatoire vu la lourdeur du moteur de template et du modèle de données. Le cache consiste à stocker dans un fichier le résultat d’une requête. La prochaine requête renverra le contenu du fichier sans effectuer les traitements coûteux en ressources. Le ViewCache (ou cache de vue) est l’un des caches le plus utilisés.

Cache de vue (View Cache)

Le cache de vue est un cache disponible pour les modules content et pdf.

Lors de l’appel d’un URL de type content/view/ (système ou virtuel), eZ Publish remplit un tableau appelé module_result. Ce tableau contient une valeur particulière content qui contient le code généré via le module. Cette variable est utilisé dans le pagelayout.

Lorsque le pagelayout est généré, la partie {$module_result.content} est remplacée par le contenu. Si le cache de vues est activé, le résultat de l’exécution du module est entièrement mis en cache, autrement dit le contenu de la variable $module_result.content est écrit dans un fichier dans le répertoire var.

Le cache de vue dépend de plusieurs paramètres :

  • le mode de vue (full, list, …)
  • la langue
  • les views parameters
  • le pagelayout
  • les préférences utilisateurs

Configuration du ViewCache

Le fichier de settings site.ini.append.php contient la déclaration.

[ContentSettings]
ViewCaching=enabled

Il est possible de désactiver le cache de vue. Cependant certains comportements sont différents si le cache de vue est désactivé ou non.

Le paramètre CachedViewModes permet de spécifier les vues sur lesquelles s’applique le ViewCache.
Par défault, on a la déclaration

CachedViewModes=full;sitemap;pdf

Gérer le cache au niveau des templates

Il est possible de désactiver le cache de vue directement au niveau des templates.

{set-block scope=root variable=cache_ttl}0{/set-block}

Il est également possible d’indiquer que le cache ne doit jamais expirer. Il suffit de renseigner à la valeur.

{set-block scope=root variable=cache_ttl}-1{/set-block}

Le cache n’est sans danger

Comme nous l’avons vu tout à l’heure pour une même vue, il peut y avoir plusieurs caches pour un même noeud de l’arborescence de contenu. Tous les paramètres à l’exception des view_parameters sont connus à l’avance, on peut donc déterminer le nombre de cache qui sera potentiellement crées. En revanche, le nombre de view_parameters et les valeurs associées sont absolument incontrôlable. Chaque URL composé de view_parameter va générer un cache différent. Il est donc possible de saturer l’espace disque d’un serveur à l’aide de quelques boucles : une belle attaque par déni de service.

Il existe 2 technique pour ne pas généré de cache : il faut soit désactiver le cache avec {set-block scope=root variable=cache_ttl}0{/set-block} soit faire une redirection (en appelant un opérateur qui encapsule la fonction PHP header). La redirection est la solution à privilégier notamment dans le cas de templates imbriqués.

Dans les 2 cas, il est impératif de vérifier les view_parameters passé à la page Web. On a plusieurs cas de figures :

  • des View Parameters non désirée sont passées à la page : il faut vérifier que le tableau ne contient que des identifiant que l’on attend sinon on désactive le cache
  • des View Parameters attendus sont passées en paramètres mais leurs valeurs est incohérente : il faut vérifier la cohérence des valeurs et le cas échéant désactiver le cache

La logique a introduire dans le langage de template est lourde voir très lourde. Je vous grâce d’un code de vérification des view_parameters.
Il existe 2 autres approches : soit ne pas utiliser le view cache, soit prendre le risque qu’un hurluberlu forge 200 000 URL différentes.

Articles liés

eZ Publish : Two Step View avec la persistent_variable
Documentation eZ Publish
Opérateur PHP avec eZ Publish
Template eZ Publish en PHP
Les datatypes d’eZ Publish : mise en place de l’extension

2 thoughts on “Le View Cache eZ Publish n’est pas sans risque

  1. Concernant l’astuce pour désactiver les caches, une moyen que je trouve plus propre est de passer par la variable ViewCacheTweaks[] du fichier site.ini

  2. Pingback: Documentation eZ Publish | truffo.fr

Laisser un commentaire

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

*

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">