我的程序使用 Zend Framework,我想使用 Zend_Form_Element_Hash 保护用户免受 CSRF 的影响。但这似乎不起作用。
例如,我的注销表单代码是
$exithash = new Zend_Form_Element_Hash('hihacker', array('salt' => 'exitsalt'));
$this->addElement($exithash);
在我的控制器 Auth 插件中,我做
$exitForm = new R00_Form_Exit();
if ($exitForm->isValid($_POST)) {
R00_Auth::logout(); // a wrapper for Zend_Auth::getInstance()->clearIdentity();
Zend_Registry::get('Log')->info('User has logged out');
$this->setRedirect($request); // redirect to the current page
}
在我的布局中
echo new R00_Form_Exit();
好的。但它不起作用,我点击表单的提交按钮,页面重新加载但身份仍然存在。
正如我所意识到的,Zend_Form_Element_Hash 每次表单创建时都会生成新的哈希值,并将用户的哈希值与会话的哈希值进行比较——最后生成的哈希值!这很奇怪。例如,即使我尝试在我的应用程序中仅创建一个 R00_Form_Exit,将其存储在注册表中并从中回显,从我的站点“在新选项卡中”打开页面也会导致所有此类受 csrf 保护的表单停止工作。
那么,我该如何保护呢?