Ochrona przed formą sabotażu jest jedną z podstawowych funkcji oferowanych przez komponent zabezpieczający. Dopóki jest włączona, wszystkie zgłoszenia POST będą traktowane jako zgłoszenia do formularza.
Zwykły ręcznie kodowany formularz HTML nie działa z włączonym komponentem zabezpieczeń, dlatego też nie będzie generowany POST przez JQuery. Możesz oczywiście użyć $this->Security->validatePost = false;
lub $this->Security->csrfCheck = false;
, ale stracisz ochronę zapewnianą przez Ochronę.
Aby komponent Security był włączony i działa normalnie, musisz użyć CakePHP Form Helper, aby utworzyć formularz, który zamierzasz opublikować przez ajax. W ten sposób ukryte pola data[_Token][fields]
i data[_Token][unlocked]
generowana z ich klucze:
<?php
echo $this->Form->create('Test',array('id'=>'testform'));
echo $this->Form->input('Something');
echo $this->Form->submit();
echo $this->Form->end();
?>
ten wygeneruje coś takiego:
<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>
Teraz to tylko kwestia szeregowania tego formularza w JQuery tak, że może wysłane z ajaxem 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
});
Teraz, jeśli naciśniesz przycisk przesyłania, POST się powiedzie.
WAŻNE: Ze względu na fakt, że Żetony postaci pomocnika może być używany tylko z elementem bezpieczeństwa raz, to rozwiązanie działa tylko jeśli tylko zamierza POST raz na pokolenie strony. Jeśli potrzebujesz, aby móc pisać tej samej formie wielokrotnie między przeładowywanie następnie trzeba wykonać następujące czynności po dodaniu elementu zabezpieczenia na początku swojej Kontroler:
public $components = array(
'Security' => array(
'csrfUseOnce' => false
)
);
... to wolę umożliwić używanie tokenów dla więcej niż jednego żądania. Nie jest on bezpieczny, ale można go łączyć z csrfExpires
, aby ostatecznie wygasły tokeny. Wszystko to jest udokumentowane w CSRF configuration section of the Cake book.
Zajmuję się tym i jestem prawie pewien, że komponent Security mnie tu zatrzymał: http://book.cakephp.org/2.0/en/core-libraries/components/security-component.html – kSeudo
OK, więc jeśli wyłączę zabezpieczenia między lokacjami: $ this-> Security-> csrfCheck = false; Działa ..... ale oczywiście to nie jest droga do celu :) Czy masz pomysł? – kSeudo
Czy możesz opublikować kod w/usermgmt/users/editUser – Leo