it-swarm.com.de

AJAX POST Anfrage mit Formular-Token antwortet immer mit "Invalid Token"

Ich sende Daten aus einem Formular mit AJAX. Die Daten sind ein Benutzername und ein Passwort des Benutzers, und deshalb möchte ich es so sicher wie möglich machen.

Ich versuche, ein token als zusätzliche Sicherheitsebene zu verwenden, aber es wird immer als " ungültig " zurückgegeben.

Ich habe https://docs.joomla.org/How_to_add_CSRF_anti-spoofing_to_forms durchlaufen und kann nicht erkennen, dass etwas falsch sein sollte.

Mein Login-Formular:

<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>

Die AJAX Anfrage:

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                
        }               
    }
}); 

Die Funktion, die in meinem view.ajax.php Aufgerufen wird

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();

}

Und die Ausgabe in meiner Konsole von 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

Das einzige, was mir noch einfällt, ist, dass &format=ajax Oder dataType: 'html' So etwas wie json oder vielleicht raw sein sollte ... aber als ich das versuchte , dann funktioniert der Anruf überhaupt nicht.

1
JonasB

Standardmäßig überprüft JSession :: checkToken () die Post-Anfrage auf einen Wert mit dem Namen Token. Es kann auch so eingestellt werden, dass in einer Abfragezeichenfolge wie JSession :: checkToken ('get') nach get-Werten gesucht wird. Es ist nicht bekannt, dass eine Variable, die Sie manuell in einer von Ihnen selbst erstellten Struktur mit dem Namen "form" serialisiert haben, der Ort ist, an dem Sie das Token finden.

Zum manuellen Testen können Sie Folgendes tun:

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

Ich habe das nicht getestet, aber ich verstehe nicht, warum es nicht funktionieren sollte. Sobald ein csrf-Token für die Sitzung erstellt wurde, bleibt es im Allgemeinen gleich.

2
jamesgarrett