Bonjour,

Ayant écumé le net sans trouver ma réponse je me permets de venir demander un peu d'aide ici.

Voici mon problème:

Je souhaite mettre en place un gestionnaire de sessions qui stocke les sessions à la fois dans le Cache et la base de données.

Pour cela j'ai donc suivi la méthode fournie dans la doc à cette adresse: http://book.cakephp.org/2.0/fr/development/sessions.html#creer-un-gestionnaire-de-session-personnalise

Jusqu’à présent tout fonctionnait parfaitement (login / stockage des sessions en base / etc...)
C'est uniquement lorsque j'active la mise en cache des sessions dans mon core.php (que ce soit via APC où via File) que je rencontre un problème.

En effet, lorsque j'active le cache des sessions dans mon handler, j'ai une belle erreur de sécurité qui apparaît quand je tente de m'identifier en tant qu'admin : "The request has been black-holed"

Je fais donc appel à vous pour m'aider à trouver une solution.
Merci d'avance.

2 réponses


maoosi
Auteur
Réponse acceptée

Merci pour la réponse ;)

Après avoir retourné le problème dans tous les sens j'ai finalement réussi à y faire fonctionner en modifiant la classe ComboSession fournie sur la doc à cette adresse: http://book.cakephp.org/2.0/fr/development/sessions.html#creer-un-gestionnaire-de-session-personnalise

App::uses('DatabaseSession', 'Model/Datasource/Session');
class ComboSession extends DatabaseSession implements CakeSessionHandlerInterface {
    public function __construct() {
        parent::__construct();
    }
    // Lit les données à partir d'une session.
    public function read($id) {
        $result = Cache::read($id);
        if ($result) {
            return $result;
        }
        return parent::read($id);
    }
    // écrit les données dans la session.
    public function write($id, $data) {
        $result = Cache::write($id, $data);
        if ($result) {
            return parent::write($id, $data);
        }
        return false;
    }
    // détruit une session.
    public function destroy($id) {
        $result = Cache::delete($id);
        if ($result) {
            return parent::destroy($id);
        }
        return false;
    }
    // retire les sessions expirées.
    public function gc($expires = null) {
        return Cache::gc() && parent::gc($expires);
    }
}

En gros j'ai supprimé le paramètre $cacheKey lié au choix du système de cache à utiliser. La classe utilise donc désormais le système de cache par défault de mon application.

Cache::config('default', array('engine' => 'File'));

L'erreur de sécurité était donc liée au choix du système de cache.

Y a pas assez de code dans ta question :) Je vais donc juste la rediriger
...
Les requetes BlackHole (la ou il detecte une attaque CRSF ou on te pique par exemple ta session) sont plutôt du au component security
Le composant security permet d'éviter qu'on te hack ton formulaire juste en le chargeant (y'a d'autres options, voir en bas) apparemment si toi tu fait le moindre truc en plus (ou en moins) paf il te blackhole ta requête, et la ta session a du rajouter un champ que le component security n'as pas bien digéré

Plus d'infos sur cakephp.org
Sinon un autre lien qui parle des 2 components