web-dev-qa-db-fra.com

AJAX POST avec le jeton de formulaire répond toujours avec un "jeton non valide"

J'envoie des données d'un formulaire avec AJAX. Les données sont un nom d'utilisateur et un mot de passe de l'utilisateur, et par conséquent, je souhaite le rendre aussi sécurisé que possible.

J'essaie d'utiliser token comme couche de sécurité supplémentaire, mais le résultat est toujours renvoyé sous la forme " non valide ".

J'ai traversé https://docs.joomla.org/How_to_add_CSRF_anti-spoofing_to_forms et je ne vois pas que quelque chose ne va pas.

Mon formulaire de connexion:

<form method="post" action="#" id="userForm">
    <label for="username">Brugernavn</label>    
    <input type="text" value="" name="username">    
    <label for="password">Password</label>  
    <input type="password" value="" name="password">
    <?php echo JHtml::_( 'form.token' ); ?>
    <button id="login-user">Login</button>
</form>

La demande AJAX:

jQuery.ajax({
    url: 'index.php?option=com_content&format=ajax&view=article&task=loginUser&tmpl=component',
    type: 'post',
    dataType: 'html',
    data: {
        form: jQuery(form).serializeArray()
    },
    async: true,
    success: function(response){
        console.log(response);
        var result = response;

        if ( result.loggedIn == 1 ) {                   
            //User logged in
            jQuery('#loginModal').modal('hide');
        }
        else {                  
            //User not logged in                
        }               
    }
}); 

La fonction qui est appelée dans mon view.ajax.php

public function _logInUser( $form ){

    $options = array();
    $credentials = array();

    var_dump($form);
    JSession::checkToken() or die( 'Invalid Token' );
    $credentials['username'] = $form[0]['value'];
    $credentials['password'] = $form[1]['value'];

    $result = JFactory::getApplication()->login($credentials, $options);        
    $result = ($result) ? 1 : 0;

    //1     - logged in
    //0     - not logged in     
    echo json_encode( array('loggedIn' => $result) );                   
    jexit();

}

Et la sortie dans ma console de var_dump($form);

array(3) {
  [0]=>
  array(2) {
    ["name"]=>
    string(8) "username"
    ["value"]=>
    string(20) "[email protected]"
  }
  [1]=>
  array(2) {
    ["name"]=>
    string(8) "password"
    ["value"]=>
    string(8) "mypassword123"
  }
  [2]=>
  array(2) {
    ["name"]=>
    string(32) "dc56f674238905e70ab3d98f9bb6e2f0"
    ["value"]=>
    string(1) "1"
  }
}
Invalid Token

La seule chose à laquelle je peux penser, est que &format=ajax Ou dataType: 'html' Devrait être quelque chose comme json ou peut-être raw ... mais quand j'ai essayé , alors l'appel ne fonctionne pas du tout.

1
JonasB

Par défaut, JSession :: checkToken () vérifie la demande de publication pour une valeur nommée le jeton. Il peut également être configuré pour rechercher des valeurs dans une chaîne de requête telle que JSession :: checkToken ('get'). Il ne sait pas qu'une variable que vous avez sérialisée manuellement dans une structure que vous avez construite et que vous appelez "formulaire" est l'endroit où trouver le jeton.

Pour le tester manuellement, vous pouvez effectuer les opérations suivantes:

if ($form[2]['name'] != JSession::getFormToken()){die();}

Je n'ai pas testé cela, mais je ne vois pas pourquoi cela ne fonctionnerait pas. Une fois qu'un jeton CSRF est créé pour la session, il reste généralement le même.

2
jamesgarrett