hash元素如何在zend框架上进行安全登录?

时间:2010-03-16 09:57:03

标签: php zend-framework hash zend-form-element

我看到了登录表单相同打击代码的示例

class Form_Login extends Zend_Form {
    //put your code here
    public function init($timeout=360){

        $this->addElement('hash', 'token', array(
             'timeout' => $timeout
        ));
        $this->setName('Login');
       $username = $this->createElement ( 'text', 'username' );
        $username->setLabel('user name:')
                ->setRequired();
                $this->addElement($username);
        $password=$this->createElement('password','password');
        $password->setLabel('password:');
        $password->setRequired();
        $this->addElement($password);
        $login=$this->createElement('submit','login');
        $login->setLabel('Login');
        $this->addElement($login);

        $this->setMethod('post');
        $this->setAction(Zend_Controller_Front::getInstance()->getBaseUrl().'/authentication/login');

    }
}

并在submitAction中

下面的部分代码

if (!$form->isValid($request->getPost())) {
            if (count($form->getErrors('token')) > 0) {
                return $this->_forward('csrf-forbidden', 'error');
            }    
            $this->view->form = $form;
            return $this->render('login');
        }

现在,我的问题,是什么原因使用哈希元素? 这个哈希元素如何进行安全登录?

任何人都可以帮忙解释这些吗?

感谢

2 个答案:

答案 0 :(得分:3)

Wikipedia has a page on it (Cross Site Request Forgery)。只是为了了解问题的措辞。 它不会使其安全,它只是防止一种攻击。

简而言之,有人可以通过让浏览器在没有用户知识的情况下加载网址(隐藏框架或带有图片标签)来更改服务器上的状态而无需用户访问该网页。

在这种情况下,它可以防止登录CSRF。例如,您可以将受害者登录到自定义Google帐户。然后,当他们使用此帐户进行搜索时,您可以访问他们的搜索历史记录。

这两种方法的缺陷是他们无法访问实际表单所在的页面。因此,保护​​是为用户分配一个哈希,以确保他们访问登录页面并提交正确的哈希以及其他值。

防御登录CSRF的一个可以说是更好的方法是检查Referer标题,如果它不正确或不存在则拒绝它。

答案 1 :(得分:2)

请参阅Zend Framework manual for Zend_Form_Element_Hash中的说明:

  

此元素提供对表单上的CSRF攻击的保护,确保数据由生成表单的用户会话提交,而不是由流氓脚本提交。通过向表单添加哈希元素并在提交表单时对其进行验证来实现保护。

如果没有令牌,蛮力脚本可以尝试猜测网站上的密码,只需通过POST随机凭证组合。但由于哈希存储在Session中,因此欺骗请求也必须包含Session Cookie,从而增加了攻击站点的难度。

因此,Login页面包含调用时的哈希/令牌。此令牌存储在会话中一定的生命周期。如果用户登录且令牌不是登录凭据的一部分,则假定请求来自不同的服务器并被拒绝。

另见Wikipedia on CSRF