【问题标题】:zf2 csrf not workingzf2 csrf 不工作
【发布时间】:2016-04-26 08:59:46
【问题描述】:

我们可以轻松破解 ZF2 的 CSRF。如果我们删除连字符 (-) 之后的字符串,CsrfValidator 不会给出任何错误,并且令牌已成功提交。

例如CSRFtoken = 245454547kck-kjhjh2454dh编辑token后token = 245454547kck-ZF2成功提交表单,但是一定会报错。

谁能检查一下,如果有解决这个问题的方法,请告诉我。

对于上述场景,我们使用:

$csrfValidator = new CsrfValidator(array(
    'name'=> 'token_name',//(here i used 'csrf' also)
    'salt'=> 'test_salt',
));
$csrf = new CsrfElement('token_name');
$csrf->setCsrfValidator($csrfValidator);
$this->add($csrf);
$this->csrf = $csrf;

验证器:

$inputFilter->add(
    $factory->createInput(array(
        'name'     => 'token_name',
        'required' => true,
        'validators' => array(
            $this->csrf->getCsrfValidator()
        )
    ))
);

请提供解决方案。

【问题讨论】:

    标签: php zend-framework2 csrf csrf-protection zend-validate


    【解决方案1】:

    据我从代码中可以看出,这是为了保持向后兼容性的预期行为。

    字符串的第二部分是令牌 ID(不是实际的反 CSRF 令牌),用于跟踪同一会话中的多个反 CSRF 令牌。如果在验证期间未设置 ID(如您的示例中),则代码仅检查会话存储中的哈希值。源代码表明这是为了避免 BC 中断 (see source code)

    如果您真的想强制执行令牌 ID,您可以扩展 Zend\Validator\Csrf 并覆盖 getValidationToken()(即删除 BC 代码):

    class MyCustomCsrf extends \Zend\Validator\Csrf
    {
        /**
         * Get validation token
         *
         * Retrieve token from session, if it exists.
         *
         * @override
         * @param string $tokenId
         * @return null|string
         */
        protected function getValidationToken($tokenId = null)
        {
            $session = $this->getSession();
            if ($tokenId && isset($session->tokenList[$tokenId])) {
                return $this->formatHash($session->tokenList[$tokenId], $tokenId);
            }
            return;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多