web-dev-qa-db-fra.com

Comment générer un code d'utilisation pseudo aléatoire une fois pour le jeton de requête

Pour éviter les attaques CSRF, nous utilisons un jeton de sécurité et validons la demande par rapport au jeton. Ceci pourrait être réalisé en utilisant le code ci-dessous pour générer un jeton

$link = JRoute::_('index.php?option=com_comp&view=comview&task=action'&'.JSession::getFormToken().'=1');

valider le jeton

JSession::checkToken('get') or die( 'Invalid Token' );

et le lien génère comme ... http: //localhost/index.php? option = com_comp & view = comview & task = action & 231a817c6f53a732b6d70f3e2c3c5fcd = 1

Maintenant ma question est: Ce code de jeton n'est pas un code à usage unique, plusieurs demandes sur le même jeton peuvent être faites.

Donc, cela ne satisfait pas réellement le but.

Je pense que le jeton de génération et le jeton de vérification doivent être liés. Une fois cette vérification effectuée, la prochaine fois que nous aurons un jeton, la valeur en sera modifiée.

Y at-il un code ou une fonction dans Joomla qui peut le faire?

6
Sasi varna kumar

J'ai également parfois besoin d'actualiser le jeton de session pour empêcher l'utilisateur d'utiliser le bouton Précédent ou de soumettre à nouveau la page. Je le fais dans mon contrôleur avec la méthode ci-dessous

/**
 * Convenience method to refresh the session token to prevent the back button
 *
 * @return void
 * @since 0.0.2
 */
protected function refreshToken()
{
    $session = JFactory::getSession();
    $session->getToken(true);
}

Cela rendra le jeton d'origine invalide. Ainsi, les formulaires soumis avec l'ancien jeton ne pourront pas être soumis à nouveau.

Une autre option que j'utilise pour les jetons qui ne sont pas liés à la sécurité est la suivante.

protected function getHash($object)
{
    return urlencode(md5(json_encode($object)));
}

J'utilise généralement ceci lorsque je sauvegarde un objet à usage unique dans la session utilisateur. Ensuite, je passe ensuite le hachage dans la redirection et désactive la variable de session lorsqu'elle arrive à l'endroit où elle doit être utilisée.

J'espère que cela vous aidera = ^ D Heureux Joomla! Ng

4
Mathew Lenning

Le jeton est lié à la session de l'utilisateur actuel et est unique. Dès que cet utilisateur est déconnecté, le jeton n'est plus utilisable. Je n'ai jamais vu de problème avec cette configuration pour éviter les attaques par usurpation sur les formulaires, donc je ne suis pas sûr que vous ayez vraiment un problème à résoudre ici.

Cependant, pour répondre à votre question, vous pouvez créer un nouveau jeton comme suit:

JSession::getFormToken(true)
3
Rob Clayburn