Login / Status
developer.Resource
Home . Development . Articles . The Mysteries Of &cHash . Les mystères du &cHash
Sponsors
hosted by punkt.deTYPO3 and Open Source Magazine

&cHash expliqué

Eliminer les incompréhensions 

Un “hash string” est un texte court avec une longueur fixe qui représente uniquement un texte d'une longueur indéfinie. Dans TYPO3 – et PHP – un tel texte est souvent généré par la fonction md5() qui créé 32 caractères hexa. TYPO3 va parfois couper de tels textes à 10 caractères ce qui est considéré comme suffisamment précis dans un tel but. 

Les “Hash strings” sont satisfaisants car il est impossible de retrouver la valeur originale avec une fonction inverse. De plus, il y a une très faible probabilité que deux sources différentes génèrent le même “hash string”. Cela signifie qu'ils sont un excellent moyen de comparaison et de validation de donnée. C'est exactement de cette façon que TYPO3 les utilise ! 

Le terme “hash” provient d'une analogie avec son standard signifiant dans le monde physique “hacher et mélanger” (selon la définition wiki : http://en.wikipedia.org/wiki/Hash_function) – Ce qui est bien entendu une définition très ennuyeuse mais je n'étais pas l'auteur de ceci.

Générer le “cHash string” 

Le texte “&cHash” est un hash des paramètres additionnels – inconnus par TYPO3 – dans une URL dans le frontend. En créant et en envoyant le texte cHash avec l'URL on peut vérifier sur le serveur que les paramètres additionnels  reçus par l'URL ont bien été créés par TYPO3 à la génération de la page. Dans ce cas on peut mettre la page en cache de façon sûre avec la base de ces paramètres supplémentaires !

Voici le flux: 

Page générée par TYPO3: 

  1. Un plugin (fonctionnant en tant que USER cObject) veut créer le lien  “?id=566&tx_myext[uid]=44&type=1&tx_myext[details]=yes” et veut le mettre en cache. Le lien est envoyé à une fonction interne de l'API : ->typolink()

  2. La fonction  ->typolink() voit que l'URL doit être mise en cache et commence par générer la valeur du cHash des paramètres. Dans ce process, les variables  “?id=566” et “&type=1” sont mises de côté car elles sont déjà connues par le système. Donc maintenant “&tx_myext[uid]=44” et “&tx_myext[details]=yes” sont ressortis et après les avoir classé alphabétiquement le hash string “13b5d6efa7” est généré. (t3lib_div::makeCacheHash())

  3. L'URL est retournée au plugin en : “?id=566&tx_myext[uid]=44&type=1&tx_myext[details]=yes&cHash=13b5d6efa7” 

 

La page est appelée par l'URL “?id=566&tx_myext[uid]=44&type=1&tx_myext[details]=yes&cHash=13b5d6efa7”: 

  1. Le serveur réagit immédiatement sur les paramètres connus qui sont “?id=566” and “&type=1” en validant la page et le numéro de type en relation avec le template. 

  2. Le serveur découvre qu'une valeur “cHash” est paramétrée; cela veut dire une chose : des paramètres additionnels dans l'URL non connus par TYPO3 doivent correspondre à cette valeur si un hash est généré à partir de ces paramètres. Après avoir filtré les paramètres &id, &type and &cHash, les paramètres  “&tx_myext[uid]=44” and “&tx_myext[details]=yes” sont confiés à TYPO3 afin de générer le hash string “13b5d6efa7” qui est exactement le même que le paramètre “&cHash”! C'est la preuve qu'aucun paramètre n'a été fabriqué par le “côté sombre du web”. La page peut sereinement être mise en cache en se basant sur la combinaison de ces paramètres personnalisés!

  3. Dans le cas où l'ennemi aurait modifié “&tx_myext[uid]=9876554321” dans le but de spammer notre table des caches, le hash string généré aura toutes les probabilité de ne pas correspondre à “13b5d6efa7”: La mise en cache de la page sera immédiatement désactivée, mais la page continuera d'être générée en tentant d'afficher une actualité portant le numéro 9876554321 (qui n'existe probablement pas, et alors ? La table des cache ne sera pas appelée avec ça...) 

Donc le cHash est comme une signature qui nous assure que les paramètres sont OK ! 

Fabriquer le &cHash? 

Maintenant, l'ennemi pourrait-il calculer le cHash lui-même ? Et bien, seulement si il est capable de deviner la valeur de $TYPO3_CONF_VARS[SYS][encryptionKey] étant donnée qu'elle est inclue à la fois dans la génération du cHash de l'URL et à la fois durant la vérification. Cette valeur est supposée secrète et tant que le cHash ne pourra pas subir de reverse engineering, la seule façon de la connaitre est soit de hacker le serveur, soit de la deviner.