Mon programme utilise Zend Framework, et je voulais protéger les utilisateurs de CSRF en utilisant Zend_Form_Element_Hash. Mais cela ne semble pas fonctionner.Comment puis-je protéger les utilisateurs contre les contrefaçons de requêtes inter-sites à l'aide de Zend Framework?
Par exemple, mon code pour le formulaire est Logout
$exithash = new Zend_Form_Element_Hash('hihacker', array('salt' => 'exitsalt'));
$this->addElement($exithash);
Dans mon plugin Auth pour contrôleur je
$exitForm = new R00_Form_Exit();
if ($exitForm->isValid($_POST)) {
R00_Auth::logout(); // a wrapper for Zend_Auth::getInstance()->clearIdentity();
Zend_Registry::get('Log')->info('User has logged out');
$this->setRedirect($request); // redirect to the current page
}
Et dans ma mise en page
echo new R00_Form_Exit();
D'accord. Mais ça ne marche pas, je clique sur le bouton submit du formulaire, la page se recharge mais l'identité existe toujours. Comme je me suis rendu compte, Zend_Form_Element_Hash génère une nouvelle valeur de hachage pour chaque formulaire de temps crée et compare le hachage de l'utilisateur avec le hachage de la session - le dernier hachage généré! C'est très étrange. Même si j'essaie, par exemple, de créer un seul R00_Form_Exit dans mon application, de le stocker dans Registry et d'en faire un écho, ouvrir une page de mon site "dans un nouvel onglet" empêchera tous les formulaires protégés par csrf de fonctionner.
Alors, comment puis-je protéger?
Comment vérifier? Je n'ai aucune idée :) Btw, j'utilise Zend_Cache avec l'adaptateur par défaut, qui utilise Zend_Session, et cela fonctionne très bien. Donc, je pense qu'il n'y a pas de problème –
Essayez simplement de vider $ _SESSION, qui devrait contenir toutes les valeurs de tous les espaces de noms Zend_Session. Si quelque part est une valeur de l'élément Hash Form, vérifiez si elle reste la même pour les deux demandes. –
Non, ce n'est pas le même :([ "Zend_Form_Element_Hash_exitsalt_hihacker"] [ "hash"] était "66cb145466361f62c7cf22899cc8807e" sur une page et "405a7413ff1b58ae966dbfac4a1b9f16" sur un autre –