Yii2 validateCsrfToken无法按预期工作

时间:2015-06-24 03:40:20

标签: ajax yii2 csrf-protection

我有以下创建操作,有两种方法可以访问,一种是通过AJAX和另一种常规方式:

public function actionCreate()
    {
        if (Yii::$app->request->isAjax && Yii::$app->request->validateCsrfToken(Yii::$app->request->post('csrf', 'falsesds'))){

          \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
      return [
          'search' => Yii::$app->request->getCsrfToken(),
          'code' => 100,
      ];
    }
        $model = new Statics();

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return $this->redirect(['view', 'id' => $model->id]);
        } else {
            return $this->render('create', [
                'model' => $model,
            ]);
        }
    }

我确信没有任何参数发送到名为csrf的操作,并在源页面中生成csrf令牌的值。尽管如此,AJAX请求总是运行得很好,即有search密钥的JSON响应。以下是我使用的Jquery AJAX代码:

$(document).ready(function(){
  var csrfToken = $('meta[name="csrf-token"]').attr("content");
  $(".addContent").click(function(event){   
    event.preventDefault();
    $.ajax(this.href,{
      data:{
        'path': getParameterByName('path', this.href),
        'position': getParameterByName('position', this.href)
      },
      type: 'POST',
      success: function(data){
        alert(data.search+"\n\n"+csrfToken);
      },
      error: function(data){
        alert('bad');
      }
    });
  });
});

我想保护这个过程,我不知道如何使用Yii2 CSRF令牌来做到这一点。换句话说,我希望阻止对发布的参数进行修改,即pathposition

1 个答案:

答案 0 :(得分:0)

实际上 csrf令牌与您想要实现的提交数据正确无关,正如我从您的问题中可以理解的那样。它只能保证数据从安全的地方提交并且可以处理。考虑使用某种类型的 hash 来检查发布的参数中是否没有修改。