2015-11-30 17:29:56 20182次浏览 5条回答 0 悬赏 10 金钱

在yii中有时候发送请求会把x-csrf-token属性放入http头属性中,这种情况是什么条件造成的?能不能手动控制

补充于 2017-04-26 13:39

11111

  • 回答于 2015-11-30 19:11 举报

    yii默认配置,可关闭。一般情况下不建议关闭。

    3 条回复
    回复于 2015-12-01 09:21 回复

    你确定理解我所说的问题了吗?我说的不是控制器的enableCsrfToken = true,是说我有时候用ajax发送post请求,http头报文里会带一个属性叫x-csrf-token的值,但是有时候又没有需要自己在post参数中自己加上,这是为什么

    回复于 2015-12-01 09:28 回复

    你确定是同一个ajax会出现一会儿有csrf,一会儿没有csrf?如果不是,请在没有csrf的ajax中补上csrf代码。 http://www.yiichina.com/tutorial/449

    回复于 2017-01-22 16:37 回复

    你还是没有听明白你楼上所问的东西

  • 回答于 2015-12-01 10:48 举报

    应该是不会自动带上 x-csrf-token 这个头信息的吧.

    你遇到的过 不带 的情况, 都是一样的请求方式么?

    都是自己手写的ajax? 而不是用的框架带的js库(比如 yii.activeForm.js)里面的方法发起的请求?

    如果方便的话 请提供多一些信息.

    1 条回复
    回复于 2015-12-02 11:54 回复

    此情况是yii.js里的方法初始化的,自动将使用ajax方法请求时把x-csrf-token属性放入header中的

    觉得很赞
  • 回答于 2015-12-16 11:59 举报

    我也遇到这个这个情况,一个是没有表单的ajax 请求 不带X-CSRF-Token 另一个是有FORM的ajax 其实上我并没有用到FORM
    页面上有FORM的自动给POST的请求头里面加上了X-CSRF-Token

    1 条回复
    回复于 2015-12-18 12:42 回复

    看我上面的回答

  • 回答于 2017-01-22 16:46 举报

    在yii1版本中并没有这个特性,yii.js中全局绑定了ajax的请求,并自动添加了一些属性比如:

    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();
        }
    

    然后验证时,多了一个方法:

    public function validateCsrfToken($token = null)
        {
            $method = $this->getMethod();
            // only validate CSRF token on non-"safe" methods http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1.1
            if (!$this->enableCsrfValidation || in_array($method, ['GET', 'HEAD', 'OPTIONS'], true)) {
                return true;
            }
    
            $trueToken = $this->loadCsrfToken();
    
            if ($token !== null) {
                return $this->validateCsrfTokenInternal($token, $trueToken);
            } else {
                return $this->validateCsrfTokenInternal($this->getBodyParam($this->csrfParam), $trueToken)
                    || $this->validateCsrfTokenInternal($this->getCsrfTokenFromHeader(), $trueToken);
            }
        }
    

    即:$this->validateCsrfTokenInternal($this->getCsrfTokenFromHeader(), $trueToken);中的$this->getCsrfTokenFromHeader()

    所以可以肯定的是,在框架内使用jquery的ajax可以不用带csrf相关参数

    , 觉得很赞
  • 回答于 2017-04-26 11:54 举报

    我也遇到了,ajax的headers里面自带x-csrf-token,不知道什么原因造成的,还是说现在的版本变了,自带了

您需要登录后才可以回答。登录 | 立即注册
YiiNewer
经理

YiiNewer

注册时间:2014-10-12
最后登录:2018-07-18
在线时长:46小时16分
  • 粉丝13
  • 金钱530
  • 威望70
  • 积分1690

热门问题