我有以下创建操作,有两种方法可以访问,一种是通过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令牌来做到这一点。换句话说,我希望阻止对发布的参数进行client-side修改,即path
和position
。
答案 0 :(得分:0)
实际上 csrf令牌与您想要实现的提交数据正确无关,正如我从您的问题中可以理解的那样。它只能保证数据从安全的地方提交并且可以处理。考虑使用某种类型的 hash 来检查发布的参数中是否没有修改。