Zend CSRF哈希码检查是否自动处理?

时间:2012-02-21 10:13:05

标签: php zend-framework zend-form

我已将以下代码添加到我的登录表单

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

在控制器动作中我有

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

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

1 个答案:

答案 0 :(得分:5)

答案是否定的。您无需做任何事情来检查散列是否有效。

创建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. 元素名称
  3. 例如,您的元素可能存储在此命名空间下:“ Zend_Form_Element_Hash_unique_hash ”,其中“unique”是salt值并哈希您的元素名称。