Yani burada ben formu nesneleri oluşturmak için kullanıyorum bir yöntemdir:
protected function _getForm($form, $action = null)
{
require_once(APPLICATION_PATH.'/modules/'.$this->_request->getModuleName().'/forms/'.$form.'.php');
$form = new $form();
if (null !== $action) {
$form->setAction($action);
}
$csrfNamespace = new Zend_Session_Namespace('Tokens');
if (false === isset($csrfNamespace->csrfToken)) {
$csrfNamespace->csrfToken = $this->_helper->randomString();
}
$csrfToken = new Zend_Form_Element_Hidden('csrf_token');
$csrfToken->setValue($csrfNamespace->csrfToken)
->addValidator(new My_Validator_CSRF())
->removeDecorator('HtmlTag')
->removeDecorator('Label');
$form->addElement($csrfToken);
return $form;
}
Gördüğünüz gibi, ben rastgele bir dize belirteç oluşturma ve forma My_Validator_CSRF () doğrulayıcı ekleme. İşte validator olduğunu:
<?php
class My_Validator_CSRF extends Zend_Validate_Abstract
{
const TOKEN_NOT_SET = 'notSet';
const TOKEN_INVALID = 'invalid';
protected $_messageTemplates = array(
self::TOKEN_NOT_SET => "'%value%' cannot be compared to anything, token has not been generated",
self::TOKEN_INVALID => "'%value%' is not valid token"
);
public function isValid($value)
{
$this->_setValue($value);
$isValid = true;
$csrfNamespace = new Zend_Session_Namespace('Tokens');
if (false === isset($csrfNamespace->csrfToken)) {
$this->_error(self::TOKEN_NOT_SET);
$isValid = false;
}
if ($csrfNamespace->csrfToken !== $value) {
$this->_error(self::TOKEN_INVALID);
$isValid = false;
}
return $isValid;
}
}
Bu Firefox ve IE harika çalışıyor ama Chrome'da ben hata mesajı alıyorum:
"b6be61a6aece979d15eb1f605e109f32" is not valid token
Ve her sayfa yenilendikten sonra belirteci değişir. Hangi Firefox ve IE değildir. Ben yanlış bir şey yapıyorum? Burada oturumu başlatmak nasıl:
ini_set('session.cookie_secure', 1);
ini_set('session.cookie_httponly', 1);
ini_set('session.use_only_cookies', 1);
// start the session
Zend_Session::start();