Frage

Ich habe Zend_Form_Element_Hash in eine Form multiplecheckbox Form enthalten. Ich habe jQuery auf Feuer aus einer AJAX-Anforderung, wenn eine Checkbox angeklickt wird, gebe ich das Token mit diesem AJAX-Request. Die erste AJAX-Anforderung funktioniert gut, aber die nachfolgend diejenigen scheitern.

Ich vermute, dass es sein kann, wenn das Token validiert wurde dann aus der Sitzung entfernt wird (Hop = 1).

Was ist Ihr Plan des Angriffs für die Sicherung eines Formulars mit Zend Framework Hash wäre noch AJAX einige dieser Anforderungen abzuschließen?

War es hilfreich?

Lösung

ich mit Zend_Form_Element_Hash schließlich aufgegeben und nur ein Token manuell erstellt, registriert es mit Zend_Session und überprüft es dann bei Vorlage.

form.php

$myNamespace = new Zend_Session_Namespace('authtoken');
$myNamespace->setExpirationSeconds(900);
$myNamespace->authtoken = $hash = md5(uniqid(rand(),1));
$auth = new Zend_Form_Element_Hidden('authtoken');
$auth->setValue($hash)
     ->setRequired('true')
     ->removeDecorator('HtmlTag')
     ->removeDecorator('Label');    

controller.php

$mysession = new Zend_Session_Namespace('authtoken');
$hash = $mysession->authtoken;
if($hash == $data['authtoken']){
    print "success";
} else {
    print "you fail";
}

Das scheint zu funktionieren und hält immer noch Dinge relativ gesund und sicher. Ich würde lieber noch das Hash-Element verwenden, aber ich kann nicht scheinen, um es mit AJAX zu arbeiten.

Danke alle.

Andere Tipps

Das ist, wie man behandelt Hash-Feld in Ajax Form:

class AuthController extends Zend_Controller_Action
{
    public function init()
    {
        $contextSwitch = $this->_helper->getHelper('contextSwitch');
        $contextSwitch->addActionContext('index', 'json')
                      ->initContext();
    }

    public function loginAction()
    {
        $form = new Application_Form_Login();
        $request = $this->getRequest();

        if ($request->isPost()) {
            if ($form->isValid($request->getPost())) {
                // some code ..
            } else {
                // some code ..

                // Regenerate the hash and assign to the view
                $reservationForm->hash->initCsrfToken();
                $this->view->hash = $reservationForm->hash->getValue();
            }
        }
        $this->view->form = $form;
    }
}

Und dann in View Skript ..

<? $this->dojo()->enable()
                ->requireModule('dojox.json.query')
                ->onLoadCaptureStart() ?>
function() {
    var form = dojo.byId("login_form")
    dojo.connect(form, "onsubmit", function(event) {
        dojo.stopEvent(event);

        var xhrArgs = {
            form: this,
            handleAs: "json",
            load: function(data) {
                // assign the new hash to the field
                dojo.byId("hash").value = dojox.json.query("$.hash", data);

                // some code ..
            },
            error: function(error) {
                // some code ..
            }
        }
        var deferred = dojo.xhrPost(xhrArgs);
    });
}
<? $this->dojo()->onLoadCaptureEnd() ?>

Hope es ist nicht zu spät: D

Es gibt eine Lösung:

Erstellen Sie neben dem Formular, das die Daten, ein Formular ohne Elemente enthalten wird. Von der Steuerung instanziieren Sie die beiden Formen. Auch in der Steuerung, fügen Sie das Element Hash auf die leere Form. Beiden Formen sollten die Vision geschickt werden. Dann wird in dem Zustand "if ($ request-> isXmlHttpRequest ())" in der Steuerung Sie das leere Formular machen. Dann nehmen Sie den Hash-Wert mit der Methode „getValue ()“. Dieser Wert muss als Antwort von Ajax gesendet wird und dann verwenden JavaScript, um den Hash-Wert zu ersetzen, die bereits veraltet ist. Die Option ein leeres Formular für den Hash erstellen, um Probleme mit anderen Elementen wie Captcha zu vermeiden, dass seine ID wieder erzeugt hätte, wenn die Form gemacht wurde, und würde auch die neuen Informationen ersetzt haben muß. Die Validierung wird separat durchgeführt, weil es zwei verschiedene Formen. Später können Sie den Hash (leer) Form wiederverwenden, wann immer Sie wollen. Im Folgenden sind Beispiele für den Code.

//In the controller, after instantiating the empty form you add the Hash element to it:
$hash = new Zend_Form_Element_Hash('no_csrf_foo');
$hash_form->addElement('hash', 'no_csrf_foo', array('salt' => 'unique'));

 //...

//Also in the controller, within the condition "if ($request->isXmlHttpRequest())" you render the form (this will renew the session for the next attempt to send the form) and get the new id value:
$hash_form->render($this->view);
$hash_value['hash'] = $hash_form->getElement('no_csrf_foo')->getValue();//The value must be added to the ajax response in JSON, for example. One can use the methods Zend_Json::decode($response) and Zend_Json::encode($array) for conversions between PHP array and JSON.

//---------------------------------------

//In JavaScript, the Ajax response function:
document.getElementById("no_csrf_foo").value = data.hash;//Retrieves the hash value from the Json response and set it to the hash input.

Leo

Form Hashes ist groß im Prinzip und ein bisschen wie ein Alptraum in der Praxis. Ich denke, der beste Weg, dies zu handhaben ist, den neuen Hash mit der Antwort zurück, wenn Sie eine Anfrage machen, und aktualisieren Sie die Form Markup oder Speicher im Speicher für Ihre Javascript als angemessen.

Der neue Hash-Wert kann aus dem Formular-Objekt zur Verfügung, oder Sie können es aus der Sitzung lesen.

Sie deutete auf die richtige Antwort in Frage: die Anzahl der Hops erhöhen

.

Es war ausdrücklich erwähnt dies in der ZF Handbuch online, aber sie ihre Handbücher aktualisiert und jetzt kann ich es nicht finden (grins) -. Sonst würde ich den Link für Sie gebucht haben

Wenn Sie folgenden Code Form Validator in Ajax Seite Gebrauch verwenden:

Myform.php

class Application_Form_Myform extends Zend_Form
{ 
    # init function & ... 
    public function generateform($nohash = false)
    { 
        # Some elements
        if(!$nohash)
        {
           $temp_csrf = new Zend_Session_Namespace('temp_csrf'); 
           $my_hash = new Zend_Form_Element_Hash ( 'my_hash' );
           $this->addElement ( $my_hash , 'my_hash');  
           $temp_csrf->hash = $my_hash->getHash();
        }
        # Some other elements
    }
}

AjaxController.php

class AjaxController extends Zend_Controller_Action
{ 
    // init ... 
    public function validateAction()
    { 
         # ... 
         $temp_csrf = new Zend_Session_Namespace('temp_csrf');
         if($temp_csrf->hash == $params['received_hash_from_client'])
         {
             $Myform     = new Application_Form_Myform(); 
             $Myform->generateform(true);
             if($AF_Bill->isValid($params))
             {
                 # Form data is valid
             }else{
                 # Form invalid
             }
         }else{
             # Received hash from client is not valid
         }
         # ... 
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top