Protezione contro la forma manomissione è una delle caratteristiche di base fornite dal componente di protezione. Finché è abilitato, tratterà tutti i POST come invii di moduli.
Un normale modulo HTML codificato manualmente non funziona con il componente di sicurezza abilitato, quindi nemmeno un POST generato da JQuery. Naturalmente, è possibile utilizzare $this->Security->validatePost = false;
o $this->Security->csrfCheck = false;
ma si perde la protezione fornita dal Componente di sicurezza.
Per mantenere il Componente di sicurezza attivo e funzionante come al solito, è necessario utilizzare l'Assistente per moduli CakePHP per creare il modulo che si invierà tramite Ajax. In questo modo i campi nascosti data[_Token][fields]
e data[_Token][unlocked]
vengono generati con le loro chiavi:
<?php
echo $this->Form->create('Test',array('id'=>'testform'));
echo $this->Form->input('Something');
echo $this->Form->submit();
echo $this->Form->end();
?>
Questo genererà qualcosa di simile:
<form action="/your/url" id="testform" method="post" accept-charset="utf-8">
<div style="display:none;">
<input type="hidden" name="_method" value="POST"/>
<input type="hidden" name="data[_Token][key]" value="9704aa0281d8b5a2fcf628e9fe6f6c8410d8f07a" id="Token937294161"/>
</div>
<div class="input text">
<input name="data[Test][Something]" class="required" type="text" id="TestSomething"/>
</div>
<div class="submit">
<input type="submit" />
</div>
<div style="display:none;">
<input type="hidden" name="data[_Token][fields]" value="0c81fda1883cf8f8b8ab39eb15d355eabcfee7a9%3A" id="TokenFields817327064"/>
<input type="hidden" name="data[_Token][unlocked]" value="" id="TokenUnlocked281911782"/>
</div>
</form>
Ora è solo una questione di serializzare questo modulo in JQuery in modo che possa essere inviato con l'ajax POST:
$('#testform').submit(function(event) {
$.ajax({
type: 'POST',
url: "/your/url",
data: $('#testform').serialize(),
success: function(data){
alert('Wow this actually worked');
},
error:function() {
alert('This will never work');
}
});
event.preventDefault(); // Stops form being submitted in traditional way
});
Ora, se si preme il pulsante di invio, il POST avrà esito positivo.
IMPORTANTE: A causa del fatto che il token è la forma di supporto può essere utilizzato solo con il componente di protezione una volta, questa soluzione funziona solo se si intende intervenire solo una volta per generazione pagina. Se avete bisogno di essere in grado di pubblicare lo stesso modulo più volte tra pagina viene ricaricata, allora è necessario eseguire le seguenti operazioni quando si aggiunge il componente di protezione all'inizio del Controller:
public $components = array(
'Security' => array(
'csrfUseOnce' => false
)
);
... questa volontà consentire che i token siano utilizzati per più di una richiesta. Non è come sicuro, ma è possibile combinarlo con csrfExpires
in modo che i token scadrà alla fine. Tutto questo è documentato nello CSRF configuration section of the Cake book.
Sto osservando questo e sono abbastanza sicuro che il componente di sicurezza mi fermi qui: http://book.cakephp.org/2.0/en/core-libraries/components/security-component.html – kSeudo
Ok così se disattivo la sicurezza cross-site con questo: $ this-> Security-> csrfCheck = false; Funziona ..... ma ovviamente questa non è la strada da percorrere :) Qualche idea? – kSeudo
puoi pubblicare il codice in/usermgmt/users/editUser – Leo