我在使用 Zend_Form 中的 Zend 的 CSRF 令牌时遇到了一些问题......
每次我提交表单时都会收到验证错误(与 CSRF 使用的“相同”)
在我的项目的早期,我对此没有任何问题,但当时我只是echo $this->form;
在我的视图中使用form
从控制器传递的位置。如果我回到这个'echo ..$form',我可以解决这个问题,但我目前需要单独和一个一个地回显每个元素,因为我需要对每个元素及其呈现方式进行大量控制。我还需要最严格的安全措施,尤其是 CSRF 等基础知识。
这就是我使用表单元素呈现“登录”页面的方式,问题显然从这里开始,但在我有表单的任何地方都是相同的(无处不在:))
.
<form id="login" enctype="application/x-www-form-urlencoded" method="<?php echo $form->getMethod() ?>" action="<?php echo $form->getAction() ?>">
<div class="login-section">
<div class="form-container inputsLogin">
<?php echo $form->agency->renderLabel() . $form->agency->renderViewHelper() ?>
<br /><br />
<?php
echo $form->username->renderLabel() .
$this->formText('username', '', array(
'required' => True,
));
echo $form->password->renderLabel() .
$this->formPassword('password', '', array(
'required' => True,
));
echo $form->returnUrl->renderLabel() . $form->returnUrl->renderViewHelper();
echo $form->csrf_token->renderLabel() . $form->csrf_token;
?>
<div class="element">
<?php echo $this->formSubmit('submit', 'Login') ?>
</div>
</div>
</div>
</form>
我已经扩展 Zend_Form 以添加 CSRF 元素,但在项目的早期,我在每个表单类中都有它。我像 $form 中的任何其他元素一样抓取 CSRF 元素并将其回显到视图上。我怀疑我的 CSRF 生成了两次,但期待第一次,但我不能说。我已经尝试了几件事...回显标签,不回显标签,在我看来完全生成 csrf 元素,设置超时(或不设置)。
另外,为了清楚起见,这是我在表单类中声明我的 CSRF 元素的方式......
class Application_Form_Actform extends Zend_Form {
function __construct()
{
parent::__construct();
$this->addElement('hash', 'csrf_token', array(
'required' => 'true',
'salt' => get_class($this) . 'unique',
'ignore' => true,
'timeout' => 60000,
'errorMessages' => array(
'Identical' => 'Form may have timed out, or there is an attempt at forgery (Security issue). Please submit form again.'
),
));
}
}
更新:我想我得到了两个令牌,这是输出var_dump($_SESSION);
:
array(2) { '__ZF' => array(1) { 'Zend_Form_Element_Hash_Application_Form_Loginunique_csrf_token' => array(2) { 'ENNH' => int(1) 'ENT' => int(1347378030) } }
'Zend_Form_Element_Hash_Application_Form_Loginunique_csrf_token' => array(1) { 'hash' => string(32) "e3df9bf3a76cf53a804b337b8b513191" } }
这是视图源中的标记:
<input type="hidden" name="csrf_token" value="a8727d61c656c64861181c7141d766a5" id="csrf_token" />