Yii2 CSRF

作者: 胡乱唱歌ing | 来源:发表于2019-08-12 10:26 被阅读0次

概述:Yii2 默认全局开启csrf验证的
1.配置csrf隐藏表单的input name

'components' => [
        'request' => [
            'csrfParam' => '_csrf-frontend',
        ],
]

2.表单嵌入csrf

<input type="hidden" name="<?php echo Yii::$app->request->csrfParam;?>"  value="<?php echo Yii::$app->request->getCsrfToken();?>" />

3.yii2 csrf验证机制
yii\web\Controller

/**
     * {@inheritdoc}
     */
    public function beforeAction($action)
    {
        if (parent::beforeAction($action)) {
            //调用csrf_token 验证方法
            if ($this->enableCsrfValidation && Yii::$app->getErrorHandler()->exception === null && !Yii::$app->getRequest()->validateCsrfToken()) {
                throw new BadRequestHttpException(Yii::t('yii', 'Unable to verify your data submission.'));
            }

            return true;
        }

        return false;
    }

yii\web\Request

public function validateCsrfToken($clientSuppliedToken = null)
    {
        $method = $this->getMethod();
        // only validate CSRF token on non-"safe" methods https://tools.ietf.org/html/rfc2616#section-9.1.1
        if (!$this->enableCsrfValidation || in_array($method, ['GET', 'HEAD', 'OPTIONS'], true)) {
            return true;
        }
       //获取服务器的csrftoken
        $trueToken = $this->getCsrfToken();

        if ($clientSuppliedToken !== null) {
            return $this->validateCsrfTokenInternal($clientSuppliedToken, $trueToken);
        }
        //验证客户端传过来的csrf_token
        return $this->validateCsrfTokenInternal($this->getBodyParam($this->csrfParam), $trueToken)
            || $this->validateCsrfTokenInternal($this->getCsrfTokenFromHeader(), $trueToken);
    }

4.客户端如何传递csrf_token
form表单POST提交

<input type="hidden" name="<?php echo Yii::$app->request->csrfParam;?>"  value="<?php echo Yii::$app->request->getCsrfToken();?>" />

AJAX提交 yii已做了自动处理
yii.js

function initCsrfHandler() {
        // automatically send CSRF token for all AJAX requests
        $.ajaxPrefilter(function (options, originalOptions, xhr) {
            if (!options.crossDomain && pub.getCsrfParam()) {
                xhr.setRequestHeader('X-CSRF-Token', pub.getCsrfToken());
            }
        });
        pub.refreshCsrfToken();
    }

5.为什么每次刷新界面csrf_token都会刷新变化,而不影响验证呢?
csrf_token 是存在会话的cookie中的,而每次都变化是Yii2做了处理,尽管输出到界面的值不断变化,但存在cookie里面的真正值是不变的。

public function getCsrfToken($regenerate = false)
    {
        if ($this->_csrfToken === null || $regenerate) {

            $token = $this->loadCsrfToken();
            if ($regenerate || empty($token)) {
                $token = $this->generateCsrfToken();
            }
            $this->_csrfToken = Yii::$app->security->maskToken($token); //这里经过处理csrf_token每次变化,但是$token始终唯一
        }

        return $this->_csrfToken;
    }

相关文章

  • Yii2 CSRF

    概述:Yii2 默认全局开启csrf验证的1.配置csrf隐藏表单的input name 2.表单嵌入csrf 3...

  • php yii2 表单提交CSRF验证

    Yii2表单提交默认需要验证CSRF,如果CSRF验证不通过,则表单提交失败,解决方法如下: 第一种解决办法是关闭...

  • Yii2 CSRF

    一、CSRF 即Cross-site request forgery跨站请求伪造,是指有人冒充你的身份进行一些恶意...

  • laravel5.8(七)关闭csrf验证

    Csrf验证这个我之前在使用Yii2框架中见到过。 这个破玩意,请求必须得带上验证的字符串,半小时页面没有活动,必...

  • 跨站伪造请求-CSRF

    CSRF: Cross-Site Request Forgery CSRF 概念 CSRF 流程 CSRF 其他概...

  • Django模板[CSRF]

    CSRF 防csrf的使用 取消csrf保护 保护原理 CSRF 全称Cross Site Request For...

  • 第五章 CSRF攻击

    要点 CSRF CSRF 防护 SSRF SSRF防护 一、CSRF攻击 CSRF(Cross-Site Requ...

  • 什么是CSRF攻击

    本文分享CSRF是什么与如何防范CSRF攻击 CSRF攻击是什么? CSRF(Cross-site request...

  • csrf如何添加认证和忽略认证

    如果设置了全局的csrf认证,免除csrf认证:添加csrf_exempt装饰器 如果没有设置全局的csrf认证,...

  • 网络安全系列(3) CSRF攻击

    1.CSRF概述 1.2 CSRF 攻击实例 1.3 CSRF 攻击的对象 2.当前防御 CSRF 的几种策略 2...

网友评论

      本文标题:Yii2 CSRF

      本文链接:https://www.haomeiwen.com/subject/vllyjctx.html