Zend CSRF散列码检查是自动处理的


Zend CSRF hash code check is handled automatically?

我在登录表单中添加了以下代码

$csrf = $this->createElement('hash', 'csrf', array('salt' => 'unique'));

在控制器操作中,我有

if (!$admin_login_form->isValid($_POST)) {
    //Throw Error
}else{
    // Redirect to index
}

现在的问题是,Zend是自动处理哈希代码检查,还是我们必须手动编写代码来验证它?

答案是否定的。您不必做任何事情来检查哈希是否有效。

当您创建一个Zend_Form_Element_Hash元素时,它会自动向您的表单添加一个验证器(使用Zend_Validate_Identical),并将您的哈希注册到一个新的命名空间会话中。

之后,一旦调用isValid()方法,如果在呈现页面时存储在会话中的CSRF与上次请求中发送的CSRF不同,则相同验证器将失败并返回错误。

编辑:此外,您可以在元素中添加salt,并根据以下加密生成哈希:md5(mt_rand(1,1000000) . $this->getSalt() . $this->getName() . mt_rand(1,1000000)

为了回答您评论中的第二个问题,两个元素不会引起任何会话冲突,因为用于存储哈希的命名空间由三个标准定义:

  1. 类名
  2. 元素名称

例如,您的元素可能存储在以下命名空间下:"Zend_Form_element_Hash_unique_Hash",其中"unique"是salt值和元素名称的Hash。