it-swarm.dev

Controllo token non funzionante nell'amministratore del componente personalizzato

Ho creato un componente personalizzato e ho tre moduli che eseguono diverse attività nella vista default.php sui subcontroller all'interno dell'amministratore. Nella mia vista tmpl default.php, Ogni modulo ha un <?php echo JHtml::_('form.token'); ?> che rende un campo nascosto con un token come il nome con un valore di 1. Ho un controllo nel mio subcontrollore, JSession::checkToken() or die per determinare se il token è valido.

Il problema è che quando si invia un modulo tramite POST, i dati POST con il token e la funzione JSession::checkToken() che controlla il token non sono una corrispondenza, quindi si traduce in FALSE. Dopo aver eseguito il debug della classe JSession, ho scoperto che quando ottiene un token, NON è lo stesso del token che viene pubblicato. Ho cercato su Google ma sono riuscito a trovare qualsiasi soluzione che funzionasse.

Secondo la documentazione di Joomla su CSRF , dovrebbe essere facile come aggiungere <?php echo JHtml::_('form.token'); ?> e aggiungere il segno di spunta nel controller JSession::checkToken() or die.

In che modo i due token possono differire dalla forma POST e classe JSession? C'è qualcos'altro che forse mi manca o non ho aggiunto che non è presente nel documento Joomla?

2
RNickMcCandless

Mi vengono in mente alcune cose:

Sei sicuro di inviare un controller "sito" e non un controller "admin"? Il token per un modulo sito vs admin sarà diverso, poiché la sessione è diversa.

Sei sicuro di inviare tramite POST? Se stai inviando tramite GET devi controllare il token usando JSession::checkToken('get')

Sei sicuro di aver inserito il campo token all'interno dei tag del modulo? È possibile visualizzare la fonte per confermare che tutto sembra corretto.

3
user101289